О поле «_id» в Android SQLite

61

Нужно ли поле "_id" в Android SQLite?

  • 0
    для любого другого попадания на страницу проверьте этот sqlite.org/autoinc.html, это действительно полезно. Специально прочитайте вещь `ROWID`.
  • 0
    Правильный ответ будет NO . Потому что в SQlite Database Engine уже есть механизм, который создает уникальный ROWID для каждой новой вставляемой строки. И если у вашей таблицы есть PRIMARY_KEY то он в конечном итоге станет псевдонимом для этого ROW_ID .
Теги:

8 ответов

52

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

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

22

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

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

  • 1
    Хороший трюк. Если вы создадите таблицу с _id (сопоставляемой с ROWID), это будет проще.
  • 2
    @ GreenBot, каков синтаксис для этого?
Показать ещё 3 комментария
10

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

"Курсор должен содержать столбец с именем" _id "или этот класс не будет работа"

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

8

Во многих случаях довольно удобно иметь поле 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);
  • 1
    должен быть "_id"?
  • 1
    ..., timestamp TIMESTAMP, ... тоже возможна.
Показать ещё 3 комментария
5

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

5

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

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

И Cursor:

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

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

  • 0
    Знаете ли вы, что _id должен быть целым числом или достаточно _id VARCHAR PRIMARY KEY ?
2

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

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню