Коли використовувати Постачальник вмісту


103

Я розумію, що постачальники вмісту створені для того, щоб вони могли публічно обмінюватися даними між програмами. Однак мені цікаво, чи є у когось думки щодо того, щоб зробити Провайдера вмісту для використання лише у власній програмі. Чи були б якісь переваги в цьому? Якісь недоліки?

Раніше я просто реалізував SQliteOpenHelper для доступу до даних зі своєї бази даних, але я розглядаю можливість створення постачальника вмісту. Я відчуваю, що підхід URI до запитів даних зрозумілий і стислий. З іншого боку, чи буде використання Провайдера вмісту лише для мого додатка зайвим (оскільки всередині нього у мене буде клас SQliteOpenHelper) і більше роботи, ніж мені потрібно?


2
Я створив бібліотеку, щоб провайдеру контенту було легко писати. Навіть простіше, ніж писати звичайний SQLiteOpenHelper. github.com/coocood/VContentProvider
coocood

Відповіді:


59

Якщо ви не плануєте обмінюватися даними, не думайте про постачальників вмісту. Вони потужні, але важко писати, і їх буде просто нерозумно реалізувати, якщо ви збираєтесь ними користуватися всередині.

Однак мені цікаво, чи є у когось думки щодо того, щоб зробити Провайдера вмісту для використання лише у власній програмі.

Звичайно ... наприклад, для старої програми списку TODO, яку я написав, мені довелося написати постачальника контенту, щоб дозволити іншим додаткам завантажувати та отримувати доступ до станів завдань. Це було частиною вимог, але більше того, що мало сенс і зробило додаток приємнішим.


34
Я погоджуюся з вашим обгрунтуванням, але я також вважаю, що важливо (особливо для початківців), що після того, як Провайдер контенту буде впроваджений, ви отримаєте багато переваг. Наприклад, ви можете використовувати CursorLoaderдля виконання асинхронних запитів ... у вас є доступ до одиночного екземпляра ( ContentResolver) для виконання запитів і т.д. можна реалізувати доступ до одного екземпляра бази даних для всієї програми ... і, звичайно, ContentProvider не потрібен, якщо ви не хочете поділитися
Алекс Локвуд

11
дані з іншими програмами. Однак, існує багато переваг, які пов'язані з впровадженням вашого власного постачальника вмісту, тому не варто відмовлятися від розгляду лише тому, що ваш додаток не передає свої дані.
Алекс Локвуд

8
Так, ви абсолютно праві, але я все ж думаю, що це не варто докладати зусиль у більшості випадків. Я зробив щонайменше 12 різних додатків для Android (опубліковані в Play Store) і ніколи не потребував ContentProvider. Насправді, останній додаток, над яким ми працювали, спочатку був зроблений з a, ContentProviderі ми просто видалили, оскільки це насправді біль у задниці, ніж слід (я навіть написав бібліотеку, щоб полегшити реалізацію основних ContentProviders: github.com/casidiablo/persistence, але ніколи не використовував його сам XD).
Крістіан

1
@ Крістіан дає найбільш практичні поради. Навіть в документі Android зазначено, що ми не повинні використовувати, ContentProviderякщо нам не потрібно - "Вам не потрібен постачальник, щоб використовувати бази даних або інші види постійного сховища, якщо використання повністю в межах вашої власної програми, і вам не потрібно будь-яку з перелічених вище функцій. Натомість ви можете використовувати одну із систем зберігання даних, описану на сторінці Збереження даних програми. " Інакше ми трохи закінчилися технікою.
Чак Ян Чен

Резюме: Якщо ви не плануєте ділитися своїми даними, ви можете уникати постачальника вмісту, але, з іншого боку, постачальник вмісту полегшує ваше життя, якщо ви хочете змінити базу даних свого додатка. наприклад, від SQLite до MangoDB.
Прашант

116

Я зауважу, що це, безумовно, хороша ідея використовувати ContentProviderнавіть якщо ви не збираєтесь оприлюднювати її.

Доброю практикою є надання додаткового рівня абстрагування ваших даних, щоб полегшити внутрішню зміну. Що робити, якщо ви вирішите пізніше змінити структуру бази даних? Якщо ви використовуєте a, ContentProviderви можете містити всі структурні зміни всередині нього, де, як ніби ви не використовуєте, ви змушені змінювати всі області коду, на які впливають структурні зміни. Крім того, приємно мати можливість повторно використовувати той же стандартний API для доступу до даних, а не засмічувати свій код низьким рівнем доступу до бази даних.

Також завжди є шанс, що ви, можливо, захочете викрити свої дані в майбутньому. Якщо ви не використовуєте ContentProviderпередню панель, згодом буде набагато складніше її доопрацювати.

Потім є інші частини Android, де ContentProviderпотрібно / рекомендується, наприклад, при використанні SyncAdapters і, якщо ви хочете, наприклад, віджет програми, який передбачає доступ до даних.

Підводячи підсумок, в написанні ContentProviderпередового досвіду дуже мало (як тільки ви навчилися API, що все-таки є хорошою ідеєю), тому це має сенс навіть для приватних даних.


1
Я не міг більше погодитися. Це змушує вас абстрагувати рівень даних таким чином, що практично гарантує, що новий розробник не зможе з'єднати інтерфейс з ним.
Габріель

3
Відразу після вивчення Android я почав мислити так само саме з цієї причини. Навіть якщо вони не є загальнодоступними, ви завжди зможете отримати вигоду від збільшення абстракції та єдиної точки реалізації своїх архітектурних рішень. Я люблю ContentProviders.
davidcsb

1
Ви можете зробити постачальника вмісту доступним лише для вашої власної програми з цим атрибутом:android:exported="false"
Toby 1 Kenobi

4
На мою скромну думку, ви можете та маєте обробляти свої дані абсолютно абстраговано, без жодної необхідності впроваджувати ContentProvider.
hmartinezd

2
Оскільки я вже збирався реалізувати рішення contentprovider для мого внутрішнього db sqlite (відсутність взаємодії з іншими програмами), я побачив зауваження на developer.android.com/guide/topics/providers/…, який стверджує, що вам не потрібен постачальник використовувати базу даних SQLite, якщо використання повністю у вашій власній програмі.
Сельчук Цихан

7

Погляньте на студію MOTODEV для Eclipse. Це середовище розвитку, яке поширює Eclipse. У них є інструмент, за допомогою якого ви можете автоматично генерувати постачальник вмісту для бази даних. Якщо постачальник контенту полегшує доступ до ваших даних, і це не має істотного впливу на продуктивність, продовжуйте користуватися ними. У більшості сценаріїв так і буде.


5

Словом, Content Providersдопомагає ефективно керувати вашими даними . Я б запропонував використовувати їх з наступних причин.

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

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


Чудова відповідь. Опис одного речення ContentProvidersта три окремі причини, чому ми повинні їх використовувати. Іноді прості пояснення найкращі. +1
AdamInTheOculus

4

Я погоджуюся, що ContentProviders трохи важко зрозуміти, але вони, безумовно, корисні, навіть якщо ви хочете використовувати їх внутрішньо для власного додатка. Найкраще в тому, що ви можете налаштувати провайдери вмісту для відповідних URI.

Ось сценарій, коли у вашій базі даних може бути 5 таблиць, але перед їх використанням вам потрібно приєднати декілька з них у певних замовленнях. І зробіть URI вмісту для кожного з цих приєднань. Потім ви можете використовувати ці URI в якості таблиці :)

Я пропоную вам продовжити постачальника вмісту, ви будете здивовані, побачивши, наскільки він потужний.


2

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

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

До речі, за допомогою генератора контент-провайдера ви зможете швидко створити базу даних та CP менше, ніж за 5 хвилин


1

Як сказано в документації: Створення постачальника вмісту

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

То чому б це турбувати розробку цього режиму? Ви хочете легшого та швидшого розвитку, правда? Тож одного шару абстракції (SQLiteOpenHelper descendent) достатньо.

Дивіться бритва Оккама Не створюйте сутностей без дуже вагомих причин.


0

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


За промовчанням постачальники контенту не піддаються впливу, а керувати обмеженнями доступу до них легко. Заголовок на поширення дезінформації.
TBridges42

2
@ TBridges42 Ви помилялися. Фактично, поки не виявилися постачальники вмісту API рівня 17 . На момент відповіді 25% Android-пристроїв вплинули на таку поведінку, а ще 10% на момент Вашого коментаря . Отже, це навпаки: ваш коментар небезпечний, оскільки ви заявляєте про щось, що є безпечним, що є / не було фактом.
Мурмель

0

Використання Постачальника вмісту може допомогти в додатковому рівні абстрагування. Якщо розмістити його у власній програмі, це додасть вашому проекту значний час на розробку. Однак якщо ви використовуєте їх для обміну даними, налаштуваннями програм або конфігурацій у кількох програмах, то Вибір вашого постачальника вмісту.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.