Точная разница между «Content-Provider» и «SQLite Database»

87

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

Но потом,

  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
Ratatouille
54

В чем точная разница между «Content-Provider» и «SQLite Database»?

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

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

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

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

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

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

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

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

зишан
источник
Я думал преобразовать свой код в контент-провайдера, но теперь думаю сохранить его.
Мохаммед Субхи Шейх Куруш
Теперь вы также можете добавить библиотеку «Комната» для Android
Равиндра Кушваха
8

1. Провайдеры контента небезопасны для потоков

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

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

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

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

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

3. Провайдеры контента иногда заставляют вас мыслить нестандартно.

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

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

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

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

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

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

Мина Сами
источник
3

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

Даниэль Урибе
источник
3

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

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

Итак, использование поставщика контента было бы хорошей идеей.

Дарпан
источник
3

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

Роберто
источник
1

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

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

ContentObserver для SQLite?

user1538028
источник