Android: столбец '_id' не существует
-
26-10-2019 - |
Вопрос
Я получаю эту ошибку
Нелегаларгментация: столбец '_id' не существует
При использовании SimpleCursorAdapter
Чтобы получить из моей базы данных, и таблица действительно имеет это _id
столбец. Заметив это общую проблему, я пытался обойти ее, учитывая некоторые решения онлайн, но ни один из них не работает. Это мой курсор запрос:
SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this, R.layout.quoterow, myCursor, new String[]{"_id", "quote"}, new int[]{R.id.quote});
Хотя я должен упомянуть, что оригинал не включал _id
В столбце я добавил это недавно, чтобы попытаться решить проблему. У кого -нибудь есть идеи, которые могут помочь решить проблему?
Решение
Ваша база данных не должна иметь столбец под названием «_ID», но простак -экипаж должен быть возвращен. Вы можете сделать это со псевдонимом.
Примером является то, что у меня есть таблица с столбцами ...
uid,name,number
Чтобы запрашивать это для простых, я делаю это с базой данных rawQuery
...
SELECT uid as _id,name,number FROM MY_TABLE
Это работает нормально и поставляет необходимый столбец «_id» для простых.
РЕДАКТИРОВАТЬ: Насколько я понимаю, поле _ID используется в качестве уникального ключа, чтобы убедиться, что данные, с которыми обрабатывает курсор, можно правильно обрабатывать адаптерами, адаптервью и т. Д.
Посмотрите на модель данных в документах для Поставщики контента.
Использование уникального ключа в «базах данных» любого рода - это в значительной степени универсальная практика, и, насколько я могу судить, использование имени столбца «_id '(или' _id ') - это просто способ стандартизации и упрощения вещей через базы данных, поставщики контента, курсоры, адаптеры и т. Д.
Короче говоря, для того, чтобы эти различные компоненты работали правильно, им нужен столбец данных с уникальными значениями, но они также должны «знать», каково название этого столбца. Они не знают, так сказать, так, что имя моего столбца «UID» - это то, что им нужно, в отличие от моего «имя» и «номер».
Другие советы
У вас либо нет столбца «_id» в вашей таблице, либо вы не включаете его в свой запрос. Это то, что вызывает исключение. Вам также нужно исправить следующее:
В вашем последнем аргументе для конструктора CursorAdapter отсутствует ссылка на столбец для _id.
Аргумент int [] представляет собой массив идентификаторов зрения для заполнения значениями из курсора. Аргумент String [] - это массив имен столбцов из строки, на которую указывает курсор.
Вы должны иметь равное количество значений в массиве, как вы делаете массив. Потому что данные из курсора захватываются из курсора и помещают в вид. Если в каждом массиве нет равных значений, адаптер бросает исключение, потому что у него нет правильного количества информации для сопоставления данных в представлениях.
Кроме того, согласно Javadoc для SimplecursorAdapter, этот конструктор устарел, потому что он вызывает выполнение запросов в потоке пользовательского интерфейса. Что плохо. Вместо этого используйте этот:
http://developer.android.com/reference/android/widget/simplecursoradapter.html#simplecursoradapter%28Android.content.Context ,%20Int,%20Android.Database.cursor ,%20Java.Lang.String []. ],%20int%29
Простое исправление было бы добавить «0» в конце списка аргументов.
Если вы пытаетесь использовать существующую базу данных SQLite в вашем приложении Android, вам необходимо выполнить некоторую подготовительную работу, чтобы заставить ее работать должным образом. В этом блоге подробно описывается процесс.
http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/