Связь между Android-провайдером и базой данных «многие ко многим» - PullRequest
7 голосов
/ 05 июля 2011

У меня есть простое приложение Notes, которое по функциональности аналогично образцу Android NotePad. Одним из добавлений является то, что каждая заметка может иметь теги. Note может иметь несколько Tag с, а Tag может принадлежать нескольким Note с, что делает это отношение многих ко многим.

Я завершил проектирование БД с использованием внешних ключей и таблицы сопоставления. Теперь я хочу, чтобы мое приложение подключилось к Android Search Framework, что требует использования ContentProvider для предоставления моих данных.

Существуют ли передовые практики, которым следует следовать в этом сценарии? Я нашел несколько связанных вопросов по SO, но большинство из них касалось отношений один ко многим (например, этот ). Из этих вопросов я пришел к выводу, что лучше иметь один ContentProvider на БД, а затем использовать концепцию Matcher для разрешения нескольких таблиц в БД. Это все еще оставляет открытыми другие вопросы.

  1. Учитывая Note ID, я хотел бы вернуть все теги, связанные с этой запиской. Как мне настроить ContentUri для такого случая? Ни один из "content://myexample/note/#" и "content://myexample/tag/#" не будет служить цели.

  2. Ни один из методов 6 ContentProvider, которые я переопределяю, не подходит для такой цели, не так ли? Я могу, конечно, ввести новый метод, но это не будет понято потребителями моего ContentProvider.

Заранее спасибо за ваши предложения.

Ответы [ 2 ]

9 голосов
/ 21 августа 2014

Теперь я нахожу интересные вещи об отношениях «многие ко многим» в Android ContentProvider. Ответ исходит из исходного кода Google I / O 2011 Offcial Android Client. Например, в приложении Google I / O есть запись с именем Session, а другая запись - Speaker. Один Session может иметь несколько Speaker, а один Speaker будет посещать несколько Session.

Итак, давайте посмотрим на решение Google:

https://github.com/google/iosched/blob/2011/android/src/com/google/android/apps/iosched/provider/ScheduleProvider.java

https://github.com/google/iosched/blob/2011/android/src/com/google/android/apps/iosched/provider/ScheduleContract.java

https://github.com/google/iosched/blob/2011/android/src/com/google/android/apps/iosched/provider/ScheduleDatabase.java

Может быть, этот ответ поможет вам, ребята.

5 голосов
/ 05 июля 2011

Да, вам нужно реализовать его с помощью ContentProvider, если вы хотите реализовать поиск.

Вы можете использовать существующего поставщика контента для получения тегов, связанных с заметкой.

вы можете определить другуюURL говорят в форме «content: // myexample / note / tag / #», чтобы получить все теги, связанные с конкретным узлом.

Вам потребуется добавить еще один URI, который должен соответствовать в вашем сопоставителе URI.скажем что-то вроде GET_NOTE_TAGS = 3;

В методе getType вашего ContentProvider верните соответствующий тип MIME.Я предполагаю, что это будет то же самое, что и тип mime для тегов, так как вы возвращаете те же теги.

Затем в ваших методах query / update / delete / insert проанализируйте входящий URI, чтобы сопоставить его с "содержание: // myexample / примечание / теги / #».Затем соответствующим образом внедрите свой запрос в вашей базе данных или в вашем контенте и верните теги, которые вам нужно вернуть.

Схема "content: // myexample / note / tag / #" является лишь примером, и вы можете использоватьнесколько URI в одном ContentProvider.

Вы также заявили, что должны объединять таблицы.это можно сделать с помощью db.query, и, если оно усложняется, вы можете использовать rawqueries, чтобы получать необходимые данные из базы данных.

...