Точна різниця між "Постачальником вмісту" та "Базою даних SQLite"


87

Я займався програмуванням бази даних SQLite для Android, але я не знаю нічого про постачальника вмісту, крім цього: "Оскільки я посилався на сторінку розробника Android, Android SDK пояснив" постачальника вмісту ", оскільки він використовується для зберігання та отримання даних."

Але з іншого боку,

  1. Яка точна різниця між "Content-Provider" та "SQLite Database"?
  2. Що найкраще зберігати дані, коли?

Будь-який приклад чи допомога !!

Відповіді:


134

Я знайшов одну велику різницю, таку:

Зберігання даних у базі даних - це один із хороших способів збереження даних , але є застереження щодо баз даних Android, створених в Android, visibleлише щодо програми, яка їх створила. Тобто база даних SQLite, створена на Android однією програмою, може використовуватися лише цією програмою, а не іншими програмами.

Отже, якщо вам need to share data between applications, you need to use the content provider model as recommended in Android.Ця стаття представляє основи постачальників вмісту та способи їх реалізації.

Я знайшов цю статтю за цим посиланням

Дійсно приємна інформація.


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

11 лютого 2012 року працює посилання http://www.devx.com/wireless/Article/41133 ,
k3b

Що робити, якщо ми забезпечуємо механізми обміну даними між різними програмами безпечним способом?
Manohar

2
Ще однією додатковою перевагою є те, що постачальники вмісту використовують один потік для кожної операції, тож декілька потоків не можуть модифікувати базу даних, як у випадку sqlite
Rat-a-tat-a-tat Ratatouille

54

Яка точна різниця між "Content-Provider" та "SQLite Database"?

ContentProviderє фасад - API, який ви можете реалізувати, який піддає бази даних іншим процесам. Це може бути реалізовано таким чином, що дані зберігаються в базі даних SQLite, але це не обов’язково.

Що найкраще зберігати дані, коли?

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


26
Я вважаю за краще використовувати ContentProvider, оскільки це дуже приємна абстракція над SQL. Ви також можете добре грати за допомогою CursorAdapter та автоматичних запитів.
alexanderblom

26

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

Однак останні пару років, коли Android розвивався, я перейшов до ContentProvider, оскільки це економить час і дозволяє робити більше. Зараз я широко його використовую. Після написання класу Постачальника вмісту ваше життя стає набагато простішим. За допомогою ContentProvider я можу набагато легше мати справу з навантажувачами курсору, зворотними викликами навантажувача та масовими вставками, для яких раніше мені доводилося писати все вручну, і все ж це працювало не так ефективно. Особливо при оновленні подання списку, яке тепер автоматично оновлюється завдяки лише одному методу notifychange (). Це означає, що тепер мені не потрібно вводити власні прослуховувачі та оновлювати вміст вручну у поданнях списку та адаптерах. Крім того, мені не потрібно турбуватися про відкриття та закриття баз даних або про витоки пам'яті. Це все обробляє Постачальник вмісту. Єдина проблема, з якою я часом стикаюся, полягає в тому, що ви не можете робити деякі складні запити в ContentProviders. У цьому випадку ви все ще можете використовувати необроблені запити та використовувати старомодну ручну взаємодію з sqlite.

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

ОНОВЛЕННЯ 2017 Я тепер перейшов на Realm , набагато кращий спосіб використання баз даних на будь-якій платформі. Витратьте кілька годин на його вивчення та заощадите незліченну кількість годин у кар’єрі розробника додатків.


Я думав перетворити свій код на постачальника вмісту, але тепер думаю зберегти його.
Мохаммед Субхі Шейх Куруш

Тепер ви також можете додати бібліотеку "Кімната" для Android
Равіндра Кушваха,

8

1. Постачальники вмісту не захищені від потоків

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

Таким чином, лише один потік одночасно може отримати доступ до цих методів.

2. Грайте приємно, роблячи багато записів

Мені потрібно в новій програмі Serval Maps імпортувати дані з двійкових файлів у базу даних, яка використовується внутрішньо додатком. Для того, щоб зробити це та приємно пограти з рештою програми, найкраще:

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

3. Постачальники контенту змушують вас часом думати побічно

Спосіб роботи постачальників вмісту в Android полягає у забезпеченні рівня абстракції між рештою коду та базовою базою даних. Це головним чином пов’язано з тим, наскільки я можу зрозуміти, що постачальники вмісту можуть отримувати доступ до даних з інших місць, крім баз даних.

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

Подумайте з боком про запит, можливо, ви зможете отримати необхідні дані за допомогою альтернативних запитів та доступу до результатів за допомогою курсору; та Використовуйте URI для нормального доступу до даних та спеціальний URI, який відповідає певному запиту для тих завдань, які не мають альтернатив.


відповідно до ContentProvider, шість абстрактних методів ContentProvider, які мають бути реалізовані, можуть бути викликані кількома потоками одночасно, тому вони повинні бути реалізовані як потокобезпечні. Абстрактний клас ContentProvider - це не причина винятків певного коду, а реалізація. Слідкуйте за процесами та потоками, щоб реалізувати безпечні для потоку методи ContentProvider.
StahlRat

5

Постачальники вмісту використовуються, коли ви хочете обмінюватися своїми даними між програмами.

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


3

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


3

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

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

Отже, використання контент-провайдера було б непоганою ідеєю.


3

Подумайте про вдосконалені системи управління вмістом. Кожен об’єкт (сторінка, зображення, стаття новин, елемент події тощо) має вміст, адресу, дозволи користувача та способи взаємодії з ним із різних частин системи. Постачальники вмісту роблять це для Android. Тепер ви можете ділитися файлами або зображеннями, які ви могли зберегти у своїй програмі. Ви також можете створювати користувацькі об'єкти, якими можна поділитися, такі як ділові контакти, редаговані нотатки тощо. І вказати безпеку та програму за замовчуванням для роботи з таким об'єктом, коли ви відкриваєте їх із будь-якої іншої програми.


1

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

Як автоматично робити повторні запити за допомогою LoaderManager

ContentObserver для SQLite?

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