Почему / Должны ли мы реализовать BaseColumns при использовании контент-провайдера в Android? - PullRequest
15 голосов
/ 22 июля 2011

Я просматривал исходный код приложения Google IOSched и заметил следующий фрагмент кода как часть их реализации провайдера контента:

public static class Blocks implements BlocksColumns, BaseColumns.

Насколько я знаю BaseColumns - это просто интерфейс с двумя константами: _COUNT и _ID.

У меня два вопроса:

  1. Каковы преимущества / недостатки реализации BaseColumns по сравнению с наличием частного поля _ID непосредственно в классе?

  2. Какова роль константы _COUNT?

Ответы [ 2 ]

23 голосов
/ 18 октября 2012

В соответствии с Руководством Android-разработчика ,

Примечание. Поставщику не требуется первичный ключ, и ему не нужно использовать _ID в качествеимя столбца первичного ключа, если таковой имеется.Однако, если вы хотите привязать данные от поставщика к ListView, одно из имен столбцов должно быть _ID.Это требование более подробно объяснено в разделе «Отображение результатов запроса».

Далее в руководстве объясняются основы того, зачем вам нужно уникальное значение, предоставленное primary key,

Табличные данные должны всегда иметь столбец «первичного ключа», который поставщик поддерживает как уникальное числовое значение для каждой строки.Вы можете использовать это значение, чтобы связать строку со связанными строками в других таблицах (используя его как «внешний ключ»).Хотя вы можете использовать любое имя для этого столбца, лучше использовать BaseColumns._ID, , поскольку для привязки результатов запроса поставщика к ListView требуется, чтобы один из полученных столбцов имел имя _ID. [emphasisмой]

Чтобы ответить на ваши вопросы в том порядке, в котором вы их задали:

  1. Наличие столбца _ID - это лучшая практика для универсальности.Его не нужно отображать, но он прекрасно работает как первичный ключ (и внешний ключ!), Необходимый для курсоров и запросов.
    • Если он идентифицирован BaseColumns, он автоматически идентифицирует этот столбец как первичный ключ, уникальный (очевидно) и инструктирует его для автоинкремента.
    • Предположительно, реализовать BaseColumns проще, чем вводить эти свойства для вашегозакрытые поля.
  2. _COUNT - это просто количество строк в каталоге. Если строки таблицы удаляются и добавляются, то нетпричина полагать, что целое число _ID элемента имеет какое-либо отношение к моменту его добавления или свойствам сортировки.Другими словами, last_insert_rowid() НЕ РАВНО Count().Столбец _COUNT просто предоставляет способ показать, сколько результатов возвращается по запросу, В КАЖДОЙ ЛИНИИ этого запроса.Для наглядного ознакомления см. linuxtopia.org
0 голосов
/ 19 января 2012

Нет реальной причины использовать его ... вы можете полностью его игнорировать и использовать свои собственные определения _ID и _COUNT (если вам нужно) ...

...