Точная разница между «Content-Provider» и «База данных SQLite» - PullRequest
84 голосов
/ 28 июля 2010

Я занимался программированием базы данных SQLite для Android, но я ничего не знаю о Content-Provider, за исключением следующего: «Как я упоминал Страница разработчика Android , Android SDK объяснил« Content-provider »какиспользуется для хранения и извлечения данных. "

Но тогда,

  1. Какова точная разница между «Content-Provider» и «База данных SQLite»?
  2. Что лучше хранить данные, когда?

Любой пример или помощь !!

Ответы [ 9 ]

132 голосов
/ 29 июля 2010

Я обнаружил одно существенное отличие:

Хранение ваших данных в базе данных - это хороший способ сохранить ваши данные , но в Android-базах, созданных в Android, есть предостережение: visible только для приложения, которое создал их. То есть база данных SQLite, созданная на Android одним приложением, может использоваться только этим приложением, а не другими приложениями.

Итак, если вы need to share data between applications, you need to use the content provider model as recommended in Android. В этой статье представлены основы контент-провайдеров и способы их реализации.

Я нашел эту статью по этой ссылке

Действительно хорошая информация.

53 голосов
/ 28 июля 2010

Какая разница между «Контент-провайдер» и «SQLite» База данных "?

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

Что лучше хранить данные, когда?

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

23 голосов
/ 05 декабря 2012

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

Однако за последние пару лет, по мере развития Android, я перешел на ContentProvider, так как он экономит время и позволяет вам делать больше. Я сейчас использую это широко. Как только у вас будет написан класс Content Provider, ваша жизнь станет намного проще. С ContentProvider я очень легко справляюсь с Cursor Loaders, Callback Callbacks и Bulk Inserts, для которых мне приходилось писать все вручную в прошлом, и все же это работало не так эффективно. Особенно при обновлении представления списка, которое теперь автоматически обновляется благодаря только одному методу notifychange (). Это означает, что теперь мне не нужно набирать своих собственных слушателей и вручную обновлять содержимое в списках и адаптерах. Кроме того, мне не нужно беспокоиться об открытии и закрытии баз данных или беспокоиться об утечках памяти. Это все обрабатывается контент-провайдером. Единственная проблема, с которой я иногда сталкиваюсь, заключается в том, что вы не можете выполнять сложные запросы в ContentProviders. В этом случае вы все еще можете использовать необработанные запросы и использовать старомодное ручное взаимодействие с sqlite.

Если вы ранее написали свои собственные DbAdapter, Helper и Observer, вы можете безопасно перенести их в свои новые приложения, не тратя время на конвертацию всего в ContentProvider. Но исходя из моего опыта, я очень рекомендую перейти на ContentProvider. Потребуется некоторое время, чтобы привыкнуть к этому, но как только вы приобретете опыт, вы останетесь с ним.

ОБНОВЛЕНИЕ 2017 Теперь я переключился на Realm , гораздо лучший способ использовать базы данных на любой платформе. Потратьте несколько часов на его изучение и сэкономьте бесчисленные часы в вашей карьере разработчика приложений.

8 голосов
/ 21 ноября 2014

1.Поставщики контента не являются потокобезопасными

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

Таким образом, только один поток за раз может получить доступ к этим методам.

2.Играйте хорошо, когда делаете много записей

Мне нужно в новом приложении Serval Maps импортировать данные из двоичных файлов в базу данных, которая используется приложением внутри.Чтобы сделать это и поиграть с остальной частью приложения, лучше всего:

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

3.Поставщики контента заставляют вас иногда думать в боковом направлении

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

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

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

5 голосов
/ 28 июля 2010

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

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

3 голосов
/ 28 июня 2015

Подумайте о современных системах управления контентом. Каждый объект (страница, изображение, новостная статья, элемент события и т. Д.) Имеет контент, адрес, права пользователя и способы взаимодействия с ним из разных частей системы. Контент-провайдеры делают это для Android. Теперь вы можете обмениваться файлами или изображениями, которые вы, возможно, сохранили в своем приложении. Вы также можете создавать настраиваемые разделяемые объекты, такие как деловые контакты, редактируемые заметки и т. Д. И указывать безопасность и приложение по умолчанию для работы с таким объектом при открытии их из любого другого приложения.

3 голосов
/ 12 мая 2015

Я прочитал этот ответ , ища то же самое сомнение, поэтому подумал поделиться им. это говорится -

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

Так что использование контент-провайдера было бы хорошей идеей.

3 голосов
/ 04 декабря 2012

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

1 голос
/ 28 декабря 2012

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

Как автоматически выполнить повторный запрос с LoaderManager

ContentObserver для SQLite?

...