Столбец Android '_id' не существует?

Я испытываю затруднения из-за чего-то, что работает в примере Блокнота. Вот код от NotepadCodeLab/Notepadv1Solution:

String[] from = new String[] { NotesDbAdapter.KEY_TITLE };
int[] to = new int[] { R.id.text1 };

SimpleCursorAdapter notes = new SimpleCursorAdapter(this,
R.layout.notes_row, c, from, to);

Этот код, кажется, хорошо работает. Но только быть ясным, я выполнил утилиту ADB и выполнил SQLite 3. Я осмотрел схему следующим образом:

sqlite> .schema

CREATE TABLE android_metadata (locale TEXT);
CREATE TABLE notes (_id integer primary key autoincrement, title text
not null, body text not null);

Все кажется хорошим мне.


Теперь на моем приложении, которое, насколько я вижу, является в основном тем же с несколькими незначительными изменениями. Я упростил и упростил свой код, но проблема сохраняется.

String[] from = new String[] { "x" };
int[] to = new int[] { R.id.x };

SimpleCursorAdapter adapter = null;
try
{
    adapter = new SimpleCursorAdapter(this, R.layout.circle_row, cursor, from, to);
}
catch (RuntimeException e)
{
    Log.e("Circle", e.toString(), e);
}

Когда я запускаю свое приложение, я получаю RuntimeException и следующую печать в LogCat от моего Log.e() оператор:

Сообщение LogCat:

java.lang. IllegalArgumentException: столбец '_id' не существует

Так, назад к SQLite 3 для наблюдения, что является особенным в моей схеме:

sqlite> .schema CREATE TABLE android_metadata (ТЕКСТ локали); круги CREATE TABLE (_id целочисленный автоинкремент первичного ключа, упорядочьте целое число, реальный радиус, x реальный, y реальный);

Я не вижу, как я пропускаю '_id'.

Что я сделал неправильно?

Одна вещь это отличается между моим приложением и примером Блокнота, состоит в том, что я запустил путем создавания моего приложения с нуля с помощью мастера Eclipse, в то время как пример приложения уже прибывает соединенный. Есть ли своего рода изменение среды, которое я должен внести, чтобы новое приложение использовало базу данных SQLite?

72
задан Deepzz 19 February 2015 в 04:59
поделиться

1 ответ

Я вижу, в документации для CursorAdapter указано:

Курсор должен включать столбец с именем _id , иначе этот класс не будет Работа.

SimpleCursorAdapter является производным классом, поэтому похоже, что это утверждение применимо. Однако это утверждение технически неверно и несколько вводит в заблуждение новичка. Набор результатов для курсора должен содержать _id , а не сам курсор.
Я уверен, что это понятно администратору баз данных, потому что такая сокращенная документация ему понятна, но для новичков неполнота инструкции вызывает путаницу. Курсоры похожи на итераторы или указатели, они не содержат ничего, кроме механизма просмотра данных, сами по себе не содержат столбцов.

Документация по загрузчикам содержит пример, в котором можно увидеть, что _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<Cursor> onCreateLoader(int id, Bundle args) {
    // ...
    return new CursorLoader(getActivity(), baseUri,
            CONTACTS_SUMMARY_PROJECTION, select, null,
            Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC");
}
153
ответ дан 24 November 2019 в 12:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: