Когда использовать контент-провайдера

103

Я понимаю, что поставщики контента созданы для того, чтобы разрешить публичный обмен данными между приложениями. Тем не менее, мне интересно, есть ли у кого-нибудь мысли о создании поставщика контента для использования только в вашем собственном приложении. Были ли в этом какие-то преимущества? Есть недостатки?

В прошлом я только что реализовал SQliteOpenHelper для доступа к данным из моей базы данных, но я подумываю о создании поставщика контента. Мне кажется, что подход URI к запросу данных ясен и лаконичен. С другой стороны, будет ли использование Content Provider только для моего приложения избыточным (поскольку в нем у меня будет класс SQliteOpenHelper) и будет ли больше работы, чем мне нужно?

Пзанно
источник
2
Я сделал библиотеку, чтобы упростить написание контент-провайдера. Даже проще, чем писать простой SQLiteOpenHelper. github.com/coocood/VContentProvider
coocood

Ответы:

59

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

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

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

Кристиан
источник
35
Я согласен с вашим обоснованием, но я также считаю важным (особенно для новичков), что после внедрения Content Provider вы получите много преимуществ. Например, вы можете использовать CursorLoaderдля выполнения асинхронных запросов ... у вас есть доступ к одноэлементному экземпляру ( ContentResolver) для выполнения запросов и т. Д. Конечно, вы можете реализовать свой собственный загрузчик для использования в своей базе данных SQLite ... конечно, вы может реализовать доступ к одному экземпляру базы данных во всем приложении ... и, конечно, ContentProvider не требуется, если вы не хотите делиться
Алекс Локвуд
12
данные с другими приложениями. Тем не менее, есть много преимуществ, которые дает реализация собственного поставщика контента, поэтому не следует отказываться от него только потому, что ваше приложение не передает свои данные.
Alex Lockwood
8
Да, вы совершенно правы, но я все же считаю, что в большинстве случаев это не стоит усилий. Я создал как минимум 12 различных приложений для Android (опубликованных в Play Store), и мне никогда не требовался ContentProvider. Фактически, последнее приложение, над которым мы работали, изначально было создано с использованием a, ContentProviderи мы просто удалили его, так как на самом деле использовать его гораздо сложнее, чем следовало бы (я даже написал библиотеку, чтобы упростить реализацию основных ContentProviders: github.com/casidiablo/persistence, но никогда не использовал его сам XD).
Cristian
1
@Cristian дает самые дельные советы. Даже в документе Android говорится, что мы не должны использовать, ContentProviderесли нам это не нужно: «Вам не нужен провайдер для использования баз данных или других типов постоянного хранилища, если использование полностью находится в вашем собственном приложении и вам не нужно любую из перечисленных выше функций. Вместо этого вы можете использовать одну из систем хранения, описанных на странице «Сохранение данных приложения». В противном случае мы просто закончили разработку.
Cheok Yan Cheng
Резюме: Если вы не планируете делиться своими данными, вы можете избежать Content Provider, но, с другой стороны, Content Provider упрощает вашу жизнь, если вы хотите изменить базу данных своего приложения. например, из SQLite в MangoDB.
Prashant
117

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

Хорошей практикой является обеспечение дополнительного уровня абстракции ваших данных, чтобы упростить внутреннее изменение. Что, если вы решите изменить базовую структуру базы данных позже? Если вы используете, ContentProviderвы можете содержать в себе все структурные изменения, где, как если бы вы его не использовали, вы были вынуждены изменить все области кода, на которые влияют структурные изменения. Кроме того, приятно иметь возможность повторно использовать тот же стандартный API для доступа к данным, а не засорять ваш код низкоуровневым доступом к базе данных.

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

Затем есть другие части Android, где ContentProviderони требуются / рекомендуются, например, при использовании SyncAdapters и если вы хотите, например, виджет приложения, который включает доступ к данным.

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

Пол Драммонд
источник
1
Я не мог с этим согласиться. Это заставляет вас абстрагироваться от уровня данных таким образом, чтобы практически гарантировать, что новый разработчик не сможет связать с ним пользовательский интерфейс.
Габриэль
3
Сразу после изучения Android я начал думать так же, именно по этой причине. Даже если это не публично, вы всегда можете извлечь выгоду из повышенной абстракции и единой точки реализации ваших архитектурных решений. Я люблю ContentProviders.
davidcesarino
2
Вы можете сделать поставщика контента доступным только для вашего собственного приложения с помощью этого атрибута:android:exported="false"
Тоби 1 Кеноби,
4
По моему скромному мнению, вы можете и должны обрабатывать свои данные полностью абстрактно, без необходимости реализации ContentProvider.
hmartinezd
2
Когда я был на пути к реализации решения Contentprovider для моей внутренней базы данных sqlite (без взаимодействия с другими приложениями), я увидел замечание на developer.android.com/guide/topics/providers/… в котором говорится, что вам не нужен поставщик использовать базу данных SQLite, если она используется полностью в вашем собственном приложении.
Сельчук Джихан
7

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

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
источник
5

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

  • Он действует как слой абстракции между вашим пользовательским интерфейсом и базой данных . Вы можете реализовать проверку данных в ContentProviders для проверки данных, введенных пользователем. Он также позволяет вам изменять структуру базы данных, не затрагивая пользовательский интерфейс и другие части.
  • Они прекрасно сочетаются с другими классами фреймворка Android, такими как SyncAdapter. Например, вы можете автоматически обновлять список при изменении значения в базе данных, используя ContentProviders вместе с CursorLoader. Без ContentProvider вам придется реализовать множество подобных функций самостоятельно.
  • Мы можем безопасно предоставлять наши личные данные другим приложениям . Использование ContentProviders позволит нам легко и безопасно обмениваться данными с другими приложениями.

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

Шива Пракаш
источник
Отличный ответ. Описание одного предложения ContentProvidersи три отдельные причины, по которым мы должны их использовать. Иногда простые объяснения оказываются лучшими. +1
AdamInTheOculus
4

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

Вот сценарий, при котором у вас может быть 5 таблиц в вашей базе данных, но вам нужно присоединить несколько из них в определенном порядке перед их использованием. И создайте URI контента для каждого из этих соединений. Затем вы можете использовать эти URI в виде таблицы :)

Я предлагаю вам продолжить работу с Content Provider, вы будете удивлены, увидев, насколько он мощный.

Шубхаю
источник
2

На мой взгляд, контент-провайдер обладает множеством преимуществ, не говоря уже о простом обмене данными с другими приложениями. Если вам нужно синхронизироваться с сервером с помощью Sync-Adapter, использовать облачный обмен сообщениями Google, автоматически обновлять пользовательский интерфейс, когда базовые данные в БД изменяются с помощью загрузчиков, реализовывать поиск, использовать виджеты ... тогда поставщик контента для вас.

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

Кстати, вы можете быстро построить свою базу данных и CP менее чем за 5 минут, используя генератор контент-провайдера.

Филипп Кигеньи
источник
1

Как сказано в документации: Создание контента поставщика

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

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

См. «Бритва Оккама». Не создавайте сущностей без веской причины.

красть
источник
0

Не используйте поставщика контента, если не хотите делиться данными с другими приложениями. Используйте простую базу данных sqlited для выполнения операций с базой данных. Будьте осторожны при использовании поставщиков контента для хранения конфиденциальных данных, поскольку к вашей конфиденциальной информации могут получить доступ другие приложения.

user3030895
источник
По умолчанию поставщики контента не отображаются, и управлять ограничениями доступа к ним легко. Голосовать против распространения дезинформации.
TBridges42
2
@ TBridges42 Вы ошибались. Фактически, до тех пор, пока не были открыты контент-провайдеры уровня API 17 . И на момент ответа 25% устройств Android пострадали от этого поведения и еще 10% на момент вашего комментария . Итак, это скорее наоборот: ваш комментарий опасен, поскольку вы заявляете что-то для безопасности, что является / не является фактом.
Мурмель 05
0

Использование Content Provider может помочь на дополнительном уровне абстракции - размещение его в вашем собственном приложении значительно увеличит время разработки вашего проекта. Однако, если вы используете его для обмена данными, настройками или конфигурациями приложений в нескольких приложениях, то поставщик контента - ваш выбор.

Следите за своими уровнями безопасности, и я бы порекомендовал использовать SQLcipher для шифрования данных при сбросе (DAR), если ваш поставщик контента пишет в SQLite. (Я использовал поставщика контента в нескольких решениях и предоставил возможность сделать «мгновенный снимок» рабочих значений для отладки и тестирования.)

Джим Роу
источник