О поле "_id" в Android SQLite - PullRequest
       6

О поле "_id" в Android SQLite

64 голосов
/ 07 июля 2010

Обязательно ли поле "_id" в Android SQLite?

Ответы [ 8 ]

54 голосов
/ 07 июля 2010

_id полезно, когда вы используете расширенные адаптеры, которые используют курсор (например, ResourceCursorAdapter). Эти адаптеры используют его для предоставления идентификатора, который можно использовать для ссылки на конкретную строку в таблице, которая связывает элемент с тем, для чего используется адаптер (например, строка в ListView).

Нет необходимости, если вы не собираетесь использовать классы, которым нужен курсор _id в курсоре, и вы также можете использовать «as _id», чтобы другой столбец отображался так, как будто он называется _id в вашем курсоре.

22 голосов
/ 02 февраля 2011

Почему бы не использовать _ROWID_ ?

SQLite обеспечивает это в любом случае для каждой строки, так что вы можете просто присвоить ей имя _id в вашем операторе select.

11 голосов
/ 02 апреля 2012

Технически no поле _id не требуется, однако, если вы используете класс CursorAdapter (которым вы, вероятно, являетесь, особенно если вы работаете с примером Блокнота), тогда да

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

, как описано в документации здесь .К сожалению, примеры кода не дают этого понять.

9 голосов
/ 07 июля 2010

Во многих случаях довольно удобно иметь поле 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);
6 голосов
/ 28 марта 2016

Если вы определили свой столбец _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;

1011 * тогда *

SELECT ROWID, _id FROM t;

и вы обнаружите, что _id и ROWID имеют одинаковое значение.

Обратите внимание, что если вы используете DESC в CREATE, создается новый столбец, а ROWID не является псевдонимом.

6 голосов
/ 26 августа 2015

Из официальных документов ...

Курсор должен включать столбец с именем _id, иначе этот класс не будет работать. Кроме того, использование MergeCursor с этим классом не будет работать, если объединенные курсоры имеют перекрывающиеся значения в столбцах «_id».

А Cursor:

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

Другими словами, вам нужно _id для Android SQLite (который обычно использует курсор)

2 голосов
/ 25 августа 2012

Конечно, нет. Это удобное поле, которое некоторые виджеты, такие как ListView, используют для заполнения данных. Смотрите эту хорошую статью: http://www.casarini.org/blog/2009/android-contentprovider-on-sqlite-tables-without-the-_id-column/

0 голосов
/ 19 июля 2013

Конечно, если вы создаете свой собственный виджет пользовательского интерфейса и собственный адаптер, вам не нужно называть свой первичный ключ как "_id". Это может быть любое имя, которое вы хотите. Но вы будете нести ответственность за управление своими коллекциями виджетов пользовательского интерфейса и связывание их с правой строкой в ​​вашей базе данных. "_id" полезен только для ListView, как указал Брэд.

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