Лучшие практики для демонстрации нескольких таблиц с помощью контент-провайдеров в Android
==========================================================================================

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

**Как я должен структурировать классы базы данных?** В настоящее время у меня есть классы для EventsDbAdapter и VenuesDbAdapter, которые предоставляют логику для запроса каждой таблицы, в то время как у меня есть отдельный DbManager (расширяет SQLiteOpenHelper) для управления версиями базы данных, создания / обновления баз данных, предоставления доступа к базе данных (getWriteable / ReadeableDatabase). Является ли это рекомендуемым решением, или мне было бы лучше либо объединить все в один класс (т.е. DbManager), либо разделить все и позволить каждому адаптеру расширять SQLiteOpenHelper?

**Как мне спроектировать контент-провайдеров для нескольких таблиц?** Продолжая предыдущий вопрос, должен ли я использовать один контент-провайдер для всего приложения или мне нужно создать отдельных провайдеров для событий и мест проведения?

Большинство примеров, которые я нахожу, касаются только приложений с одним столом, поэтому я был бы признателен за любые указатели здесь.

Который можно найти в Интернете). Они обрабатывают запросы между таблицами, предоставляя специализированные представления, с которыми вы затем выполняете запросы на серверной части. На внешнем интерфейсе они доступны для вызывающего абонента через различные URI через одного поставщика контента. Возможно, вы также захотите предоставить один или два класса для хранения констант для имен полей таблицы и строк URI. Эти классы могут быть предоставлены как в виде включения API, так и в виде класса исключения, что значительно облегчит использование приложения-потребителя.

Это немного сложно, поэтому вы также можете проверить, как работает календарь, чтобы получить представление о том, что вы делаете, а что нет.

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



`ContentProvider` может обслуживать несколько таблиц, но они должны быть несколько связаны. Это будет иметь значение, если вы собираетесь синхронизировать своих провайдеров. Если вам нужна отдельная синхронизация для, скажем, контактов, почты или календаря, вам понадобятся разные провайдеры для каждого из них, даже если они в конечном итоге находятся в одной базе данных или синхронизируются с одной и той же службой, поскольку адаптеры синхронизации напрямую связаны с конкретный поставщик.

Насколько я могу судить, вы можете использовать только один SQLiteOpenHelper для каждой базы данных, поскольку он хранит свою метаинформацию в таблице в базе данных. Так что если ваш`ContentProviders` доступ к той же базе данных, вам придется каким-то образом поделиться Помощник.



Этот подход подразделяет каждый из`insert`, `delete`, `update`, а также`getType` методы с инструкциями switch для обработки каждой из ваших отдельных таблиц. Вы будете использовать CASE для идентификации каждой таблицы (или URI), на которую будут ссылаться. Каждый CASE затем отображается на одну из ваших таблиц или URI. Например.,**ТАБЛИЦА 1** или же**URI1** выбран в CASE # 1 и т. д. для всех таблиц, которые использует ваше приложение.

Вот пример подхода. Это для метода вставки. Он реализован немного иначе, чем Opy, но выполняет ту же функцию. Вы можете выбрать стиль, который вы предпочитаете. Я также хотел убедиться, что вставка возвращает значение, даже если вставка таблицы не удалась. В этом случае он возвращает`-1`.



Сначала вам нужно создать несколько CONTENT\_URI

Затем вы расширяете свой URI Matcher

Затем создайте свои таблицы

Не забудьте добавить второй`DATABASE_CREATE` в`onCreate()`

Вы собираетесь использоватьПереключатель регистра блок, чтобы определить, какая таблица используется. Это мой код вставки

Вам нужно будет разделить`delete`, `update`, `getType`и т. д. Везде, где ваш провайдер вызывает DATABASE\_TABLE или CONTENT\_URI, вы добавляете дело, и у вас есть DATABASE\_TABLE1 или CONTENT\_URI1 в одном и № 2 в следующем и так далее столько, сколько вы хотите.



**Поставщик услуг** и я думаю, что это следовало стандартам Android.

**Контрактные классы**

а также**Внутренние классы:**

Теперь создание базы данных с использованием**SQLiteOpenHelper**:

**Поставщик услуг:**

Я надеюсь, что это поможет вам.

Демо на**GitHub:<https://github.com/androidessence/MovieDatabase>**

**Полная статья:<https://guides.codepath.com/android/creating-content-providers>**

**Рекомендации:**

<http://code.tutsplus.com/tutorials/android-sdk_content-providers--mobile-5549>

<http://www.grokkingandroid.com/android-tutorial-writing-your-own-content-provider/>

[http://developer.android.com/guide/topics/providers/content-providers.html](https://developer.android.com/guide/topics/providers/content-providers.html)

<https://thenewcircle.com/s/post/1375/android_content_provider_tutorial>

<http://www.grokkingandroid.com/android-tutorial-content-provider-basics/>

<http://androidessence.com/>

Примечание: я скопировал код только потому, что в будущем возможно удаление ссылки из демонстрации или статьи.