_id полезен, когда вы используете расширенные адаптеры, которые используют курсор (например, ResourceCursorAdapter). Он используется этими адаптерами для предоставления идентификатора, который может использоваться для ссылки на определенную строку в таблице, которая связывает элемент во всех используемых адаптерах (например, в строке в ListView).
Не нужно, если вы не собираетесь использовать классы, которым нужен столбец _id в курсоре, и вы также можете использовать "как _id", чтобы сделать другой столбец, как если бы он назывался _id в вашем курсоре.
Почему бы не использовать _ ROWID_?
SQLite предоставляет это в любом случае для каждой строки, поэтому вы можете просто переписать его в _id в своем заявлении select.
Технически нет поля _id
не требуется, однако, если вы используете класс CursorAdapter
(который вы, вероятно, используете, особенно если вы работаете с примером Notepad), тогда да
"Курсор должен содержать столбец с именем" _id "или этот класс не будет работа"
как описано в документации здесь. К сожалению, примеры кода не делают этого очень ясным.
Во многих случаях довольно удобно иметь поле 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);
..., timestamp TIMESTAMP, ...
тоже возможна.
Если вы определяете свой столбец _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
не псевдонимы.
Из официальных официальных документов...
Курсор должен содержать столбец с именем "_id" или этот класс не будет работать. Кроме того, использование MergeCursor с этим классом не будет работать, если объединенные курсоры имеют перекрывающиеся значения в своих столбцах "_id".
И Cursor
:
Этот интерфейс обеспечивает случайный доступ для чтения и записи к набору результатов, возвращаемому запросом базы данных.
Другими словами, вам нужно _id
для Android SQLite (который обычно использует Cursor)
_id
должен быть целым числом или достаточно _id VARCHAR PRIMARY KEY
?
Конечно нет. Это поле удобства, которое некоторые виджеты, такие как ListView, используют для заполнения данных. См. Эту хорошую статью: http://www.casarini.org/blog/2009/android-contentprovider-on-sqlite-tables-without-the-_id-column/
Конечно, если вы создаете свой собственный виджет пользовательского интерфейса и свой собственный адаптер, вам не нужно называть ваш первичный ключ как "_id". Это может быть любое имя, которое вы хотите. Но вы несете ответственность за управление коллекциями пользовательских виджетах и привязкой их к правой строке в своей базе данных. "_id" полезен только для ListView, как указал Брэд.
NO
. Потому что в SQlite Database Engine уже есть механизм, который создает уникальныйROWID
для каждой новой вставляемой строки. И если у вашей таблицы естьPRIMARY_KEY
то он в конечном итоге станет псевдонимом для этогоROW_ID
.