Куда деваются логика приложения и ограничения при создании ContentProviders?

#android #domain-driven-design #repository-pattern #android-contentprovider

#Android #дизайн, управляемый доменом #репозиторий-шаблон #android-contentprovider

Вопрос:

Я начинаю изучать разработку для Android, а также пытаюсь следовать шаблонам проектирования DDD. Одна вещь, которая меня смущает, — это то, куда девается логика приложения в отношении ContentProviders.

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

Большинство примеров ContentProviders, которые я нахожу, показывают, что они обращаются к базе данных напрямую. Неправильно ли располагать объект Service или Application между ContentProviders и database?

Например, я пытаюсь создать приложение для личных финансов / бюджета (например, Mint / Quicken и т.д.). У меня будет база данных транзакций и соответствующий TransactionProvider. В большинстве случаев транзакции независимы друг от друга. Тем не менее, если две транзакции помечены как часть одной и той же «Передачи», там будут некоторые поля, которые я захочу синхронизировать между двумя транзакциями. Если кто-то изменяет категорию или сумму одной транзакции, я хочу убедиться, что те же значения обновляются для транзакции для другой учетной записи передачи.

Ответ №1:

ContentProvider Может выполнять произвольный код на своих insert() , update() delete() и query() методах. Они не обязательно сопоставляются один к одному с соответствующими операциями базы данных, как и сами определения структуры (т. Е. Полей). Вы могли бы, например:

  • Обновляйте более одной таблицы при вставке, обновлении или удалении.
  • Сохраняйте нормализованные таблицы в SQLite, но представляйте ненормализованный интерфейс для выполнения запросов.
  • Вообще не хранить данные в базе данных (например, для предоставления доступа к файлам, доступным в личном хранилище вашего приложения, или манипулирования ими).
  • и c.

Таким образом, вы действительно можете включить любую бизнес-логику, какую захотите, в «серверную часть» ContentProvider. В вашем случае это означало бы обновление связанных записей для их синхронизации.

Просто для пояснения, поскольку вы начинаете разработку Android, нет необходимости создавать ContentProvider, если вы просто хотите хранить данные в SQLite — вы можете использовать SQLiteDatabase непосредственно для этого. ContentProvider, как правило, предназначен для предоставления ваших собственных данных другим приложениям или для специализированных случаев, таких как предложения по поиску.

Из Создания поставщика контента:

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

  • Вы хотите предоставлять сложные данные или файлы другим приложениям.
  • Вы хотите разрешить пользователям копировать сложные данные из вашего приложения в другие приложения.
  • Вы хотите предоставить пользовательские предложения для поиска с использованием search framework.

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

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