2016-01-31 4 views
0

Можно ли создать ContentProvider для каждой таблицы, означает нескольких поставщиков контента в одном приложении?Несколько ContentProvider в одном приложении

Я хочу сделать это по разным причинам.

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

2- Я не хочу делиться всем классом ContentProvider с другим приложением. Я просто хочу поделиться несколькими или только с одной таблицей.

ответ

0

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

3

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

Однако при принятии решения о том, следует ли идти с одним или несколькими поставщиками контента, нужно учитывать больше вещей. Вот некоторые из них:

Ваш вопрос подразумевает, что вы планируете использовать одну и ту же базу данных SQLite (я понял это из термина «таблица») в обоих контент-провайдерах, что не является хорошей идеей. Каждый поставщик контента, вероятно, иметь свой собственный экземпляр SQLiteOpenHelper для базы данных, которая означает, что вы можете столкнуться с фиксирующими вопросами см этого ответа: https://stackoverflow.com/a/3689883/1558654

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

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

Что касается вашего разума # 1: Не уверен, что если вы говорите об интерфейсе (договор) или о фактическом файле .java, но это действительно не имеет значения, так как это просто архитектурная проблема, которая, безусловно, разрешается при наличии единого поставщика контента. Если файл класса контент-провайдера слишком велик, ваша архитектура, вероятно, не так хороша.

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

Связаны ли данные (или данные о том же виде)? Вероятно, лучше использовать только одного поставщика контента.

Это абсолютно не связано? Лучше всего выбор двух поставщиков контента.

Причина # 2 нуждается в дополнительном рассмотрении. Вопрос в том, почему вы не хотите раскрывать определенные таблицы? Это проблема безопасности/конфиденциальности? Или это просто, что другим приложениям не нужны данные?

Если это для обеспечения безопасности или конфиденциальности, вероятно, лучше использовать два поставщика контента и установить android:exported="false" на тот, который хранит конфиденциальные данные. Но даже с одним поставщиком контента есть способы защитить их.

Если безопасность или конфиденциальность не являются проблемой, просто не публикуйте URI контента другим таблицам в вашем публичном контракте.

+0

Отлично! Спасибо человеку за ответ на каждый аспект моего вопроса. –

Смежные вопросы