Я вижу, что в документации для CursorAdapter указано:
Курсор должен содержать столбец с именем
_id
или этот класс не будет работать.
SimpleCursorAdapter
является производным классом, поэтому представляется, что это утверждение применяется. Однако заявление технически неверно и несколько вводит в заблуждение новичка. Набор результатов для курсора должен содержать_id
, а не сам курсор. Я уверен, что это понятно для администратора баз данных, потому что эта краткая документация им понятна, но для этих новичков, будучи неполным в заявлении, вызывает путаницу. Курсоры подобны итераторам или указателям, они не содержат ничего, кроме механизма трансверсации данных, они не содержат самих столбцов.Документация Loaders содержит пример, где можно видеть, что
_id
включен в параметр проекции.
static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] { Contacts._ID, Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS, Contacts.CONTACT_PRESENCE, Contacts.PHOTO_ID, Contacts.LOOKUP_KEY, }; public Loader
onCreateLoader(int id, Bundle args) { // ... return new CursorLoader(getActivity(), baseUri, CONTACTS_SUMMARY_PROJECTION, select, null, Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"); }
Поскольку вы сказали, что анализируете документ .txt
(со встроенными комментариями HTML), вы можете попробовать Regexp::Grammars
. Вот отправная точка:
use strict;
use warnings;
use Regexp::Grammars;
my $parser = qr{
<nocontext:>
<words>
<token: words> (?:(?:<[word]><[separator]>?)|(?:<[separator]><[word]>?))+
<token: word> <.wordchar>+
<token: separator> <.comment> | (?:(?:(?!<.comment>)(?!<.wordchar>)).)+
<token: wordchar> [a-zA-Z]
<token: comment> \< <.wordchar>+ \> [^<]* \</\>
}sx;
my $fn = 'file.txt';
open ( my $fh, '<', $fn ) or die "Could not open file '$fn': $!";
my $text = do { local $/; <$fh> };
close $fh;
if ($text =~ $parser) {
for my $word (@{ $/{words}{word} } ) {
print "'", $word, "'\n";
}
}