Нужно ли поле "_id" в Android SQLite?
О поле "_id" в Android SQLite
Ответ 1
_id полезен, когда вы используете расширенные адаптеры, которые используют курсор (например, ResourceCursorAdapter). Он используется этими адаптерами для предоставления идентификатора, который может использоваться для ссылки на определенную строку в таблице, которая связывает элемент во всех используемых адаптерах (например, в строке в ListView).
Не нужно, если вы не собираетесь использовать классы, которым нужен столбец _id в курсоре, и вы также можете использовать "как _id", чтобы сделать другой столбец, как если бы он назывался _id в вашем курсоре.
Ответ 2
Почему бы не использовать _ ROWID_?
SQLite предоставляет это в любом случае для каждой строки, поэтому вы можете просто переписать его в _id в своем заявлении select.
Ответ 3
Технически нет поля _id
не требуется, однако, если вы используете класс CursorAdapter
(который вы, вероятно, используете, особенно если вы работаете с примером Notepad), тогда да
"Курсор должен содержать столбец с именем" _id "или этот класс не будет работа"
как описано в документации здесь. К сожалению, примеры кода не делают этого очень ясным.
Ответ 4
Во многих случаях довольно удобно иметь поле id. Я предпочитаю, чтобы мой автоматически увеличивался (как показано ниже). Я всегда нахожу новые применения для поля id:)
Когда пришло время подключать данные к адаптеру, мне нравится использовать псевдоним имени таблицы для запроса поля id как _id
. Пример: SELECT id _id, msg from message order by id
. Таким образом, адаптер видит поле под названием _id
, и все счастливы.
Вот пример того, как я определяю свои таблицы:
CREATE TABLE message (_id INTEGER PRIMARY KEY AUTOINCREMENT, timestamp INTEGER, tripID TEXT, msg TEXT);
Ответ 5
Из официальных официальных документов...
Курсор должен содержать столбец с именем "_id" или этот класс не будет работать. Кроме того, использование MergeCursor с этим классом не будет работать, если объединенные курсоры имеют перекрывающиеся значения в своих столбцах "_id".
И Cursor
:
Этот интерфейс обеспечивает случайный доступ для чтения и записи к набору результатов, возвращаемому запросом базы данных.
Другими словами, вам нужно _id
для Android SQLite (который обычно использует Cursor)
Ответ 6
Если вы определяете свой столбец _id как целое число автоинкремент, это фактически псевдоним для столбца ROWID, который по умолчанию предоставляет SQLite (https://www.sqlite.org/lang_createtable.html#rowid).
Ваше выражение о создании нуждается в форме...
CREATE TABLE t(_id INTEGER PRIMARY KEY ASC, y, z);
Чтобы доказать, что это работает...
UPDATE t SET _id=22 WHERE _id=11;
затем
SELECT ROWID, _id FROM t;
и вы обнаружите, что оба _id
и ROWID
имеют одинаковое значение.
Обратите внимание, что если вы используете DESC в CREATE, создается новый столбец и ROWID
не псевдонимы.
Ответ 7
Конечно нет. Это поле удобства, которое некоторые виджеты, такие как ListView, используют для заполнения данных. См. Эту хорошую статью: http://www.casarini.org/blog/2009/android-contentprovider-on-sqlite-tables-without-the-_id-column/
Ответ 8
Конечно, если вы создаете свой собственный виджет пользовательского интерфейса и свой собственный адаптер, вам не нужно называть ваш первичный ключ как "_id". Это может быть любое имя, которое вы хотите. Но вы несете ответственность за управление коллекциями пользовательских виджетах и привязкой их к правой строке в своей базе данных. "_id" полезен только для ListView, как указал Брэд.