Я испытываю затруднения из-за чего-то, что работает в примере Блокнота. Вот код от 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?
Я вижу, в документации для 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");
}