Android: столбец '_id' не существует - PullRequest
8 голосов
/ 29 апреля 2011

Я получаю эту ошибку

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

При использовании SimpleCursorAdapter для извлечения из моей базы данных, и в таблице действительно есть этот столбец _id. Заметив, что это общая проблема, я попытался обойти ее, предоставив некоторые решения в Интернете, но ни одно из них не помогло. Это мой курсорный запрос:

SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this, R.layout.quoterow, myCursor, new String[]{"_id", "quote"}, new int[]{R.id.quote});

, хотя я должен упомянуть, что в оригинале не было столбца _id, я добавил это недавно, чтобы попытаться решить проблему. У кого-нибудь есть идеи, которые могут помочь решить проблему?

Ответы [ 3 ]

15 голосов
/ 29 апреля 2011

В вашей базе данных не обязательно должен быть столбец с именем _id, но SimpleCursorAdaptor должен иметь возвращаемый столбец. Вы можете сделать это с псевдонимом.

Например, у меня есть таблица со столбцами ...

uid,name,number

Чтобы запросить это для SimpleCursorAdapter, я делаю это с базой данных rawQuery ...

SELECT uid as _id,name,number FROM MY_TABLE

Это отлично работает и предоставляет необходимый столбец '_id' в SimpleCursorAdapter.

РЕДАКТИРОВАТЬ: Насколько я понимаю, поле _id используется в качестве уникального ключа, чтобы обеспечить правильную обработку данных, которые обрабатывают курсор, адаптерами и представлениями адаптеров и т. Д.

Посмотрите на модель данных в документах для Поставщики контента .

Использование уникального ключа в «базах данных» любого рода является довольно универсальной практикой, и, насколько я могу судить, использование имени столбца «_id» (или «_ID») является просто способом стандартизации и упрощение работы с базами данных, поставщиками контента, курсорами, адаптерами и т. д.

Короче говоря, для того, чтобы эти различные компоненты работали правильно, им нужен столбец данных с уникальными значениями, но они также должны «знать», как называется этот столбец. Они не могли бы, так сказать, «знать», что мое имя столбца «uid» - это то, что им нужно, а не мои столбцы «имя» и «число».

0 голосов
/ 29 апреля 2011

Если вы пытаетесь использовать существующую базу данных sqlite в своем приложении для Android, вам необходимо выполнить некоторые подготовительные работы, чтобы она работала правильно. В этом блоге подробно описывается этот процесс.

http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/

0 голосов
/ 29 апреля 2011

В вашей таблице либо нет столбца "_id", либо вы не включили его в свой запрос.Вот что вызывает исключение.Также необходимо исправить следующее:

В вашем последнем аргументе для конструктора CursorAdapter отсутствует ссылка на столбец to для _id.

Аргумент int [] представляет собой массив идентификаторов представлений для заполнения.со значениями из курсора.Аргумент String [] - это массив имен столбцов из строки, на которую указывает курсор.

Вы должны иметь равное количество значений в массиве from, как и в массиве to.Потому что данные из курсора извлекаются из курсора и помещаются в представления.Если в каждом массиве нет равного числа значений, адаптер выдает исключение, потому что у него нет нужного количества информации для сопоставления данных с представлениями.

Кроме того, согласно JavaDoc дляSimpleCursorAdapter, этот конструктор устарел, поскольку он вызывает выполнение запросов в потоке пользовательского интерфейса.Что плохоИспользуйте это вместо этого:

http://developer.android.com/reference/android/widget/SimpleCursorAdapter.html#SimpleCursorAdapter%28android.content.Context,%20int,%20android.database.Cursor,%20java.lang.String[],%20int[],%20int%29

Простым решением было бы добавить «, 0» в конец списка аргументов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...