Я занимался программированием базы данных SQLite для Android, но я ничего не знаю о Content-Provider, кроме следующего: «Как я уже говорил, страница Android Developer , Android SDK объяснил, что такое Content-provider, поскольку он используется для хранения и извлечения данных».
Но потом,
- В чем точная разница между «Content-Provider» и «SQLite Database»?
- Что лучше всего хранить данные и когда?
Любой пример или помогает !!
источник
ContentProvider
это фасад - API, который вы можете реализовать, который предоставляет базы данных другим процессам. Это может быть реализовано таким образом, что данные хранятся в базе данных SQLite, но это не обязательно.На это невозможно ответить абстрактно. Вообще говоря, если что-то не требует от вас использования
ContentProvider
, просто используйте базу данных.источник
Я сделал много хороших приложений с тысячами пользователей, использующих их, которые просто использовали методы SQLite. Но это было некоторое время назад, и мне пришлось вручную написать много кода, о котором теперь легко позаботится ContentProvider. В то время я не был сторонником использования контент-провайдеров, потому что это, казалось, только усложняло код.
Однако в последние пару лет, по мере развития Android, я перешел на ContentProvider, так как это экономит время и позволяет делать больше. Сейчас я активно им пользуюсь. Когда вы напишете класс Content Provider, ваша жизнь станет намного проще. С ContentProvider я могу легко справиться с загрузчиками курсора, обратными вызовами загрузчика и массовыми вставками, для которых в прошлом мне приходилось все писать вручную, и все же это работало не так эффективно. Особенно при обновлении представления списка, которое теперь автоматически обновляется благодаря всего одному методу notifychange (). Это означает, что теперь мне не нужно набирать собственные прослушиватели и вручную обновлять содержимое в представлениях списков и адаптерах. Кроме того, мне не нужно беспокоиться об открытии и закрытии баз данных или об утечках памяти. Этим все занимается поставщик контента. Единственная проблема, с которой я время от времени сталкиваюсь, заключается в том, что вы не можете выполнять некоторые сложные запросы в ContentProviders. В этом случае вы все еще можете использовать необработанные запросы и использовать старомодное ручное взаимодействие с sqlite.
Если вы ранее написали свои собственные DbAdapter, Helper и Observer, вы можете безопасно перенести их в свои новые приложения, не тратя время на преобразование всего в ContentProvider. Но, исходя из своего опыта, очень рекомендую перейти на ContentProvider. Чтобы привыкнуть к этому, потребуется некоторое время, но как только у вас появится опыт, вы останетесь с ним.
ОБНОВЛЕНИЕ 2017 Я перешел на Realm , гораздо лучший способ использовать базы данных на любой платформе. Потратьте несколько часов на его изучение и сэкономьте бесчисленные часы в своей карьере разработчика приложений.
источник
1. Провайдеры контента небезопасны для потоков
По умолчанию поставщики контента не поддерживают потоки. Если у вас есть несколько потоков, использующих поставщика контента, вы можете увидеть много разных исключений и другие несоответствия данных. Самый простой способ исправить это - использовать ключевое слово synchronized в каждом из общедоступных методов, предоставляемых поставщиком содержимого.
Таким образом, только один поток одновременно может получить доступ к этим методам.
2. Играйте хорошо, когда много пишите
Мне нужно новое приложение Serval Maps для импорта данных из двоичных файлов в базу данных, используемую внутри приложения. Чтобы сделать это и поиграть с остальной частью приложения, лучше всего:
Создайте новый поток для выполнения импорта, чтобы не пострадали другие потоки, в частности поток, отвечающий за обновление пользовательского интерфейса; и ненадолго приостанавливаться в конце каждого импорта, чтобы дать другим потокам больше шансов использовать синхронизированные методы.
3. Провайдеры контента иногда заставляют вас мыслить нестандартно.
Поставщики контента в Android работают так, чтобы обеспечить уровень абстракции между остальной частью вашего кода и базовой базой данных. В основном это связано с тем, насколько я могу судить, провайдеры контента могут получать доступ к данным из других мест, кроме баз данных.
Это означает, что вы не можете выполнять необработанные SQL-запросы в базовой базе данных, и вам необходимо указать различные компоненты SQL-запроса, используя переменные, передаваемые в различные методы, такие как метод запроса. Если у вас есть задача, которая не вписывается в способ обработки SQL поставщиком контента, у вас есть два варианта:
Подумайте о запросе горизонтально, возможно, вы сможете получить нужные данные с помощью альтернативных запросов и доступа к результатам с помощью курсора; и Используйте URI для обычного доступа к данным и специальный URI, соответствующий конкретному запросу для тех задач, для которых нет альтернатив.
источник
Поставщики контента используются, когда вы хотите обмениваться данными между приложениями.
Если у вас есть база данных, подключенная к приложению, и вы хотите, чтобы другое приложение использовало некоторые данные, вы можете реализовать поставщика контента, который предоставляет данные.
источник
Основное различие заключается в следующем: когда вашему приложению необходимо обмениваться информацией с другими приложениями, используйте Content-Provider. SQLite хранит только данные для приложения, которое их создает
источник
Я прочитал этот ответ , ища такие же сомнения, поэтому подумал о том, чтобы поделиться им. Здесь утверждается -
Итак, использование поставщика контента было бы хорошей идеей.
источник
Подумайте о продвинутых системах управления контентом. Каждый объект (страница, изображение, новостная статья, элемент события и т. Д.) Имеет контент, адрес, права пользователя и способы взаимодействия с ним из разных частей системы. Контент-провайдеры делают это для Android. Теперь вы можете делиться файлами или изображениями, которые вы, возможно, сохранили в своем приложении. Вы также можете создавать настраиваемые объекты для совместного использования, такие как деловые контакты, редактируемые заметки и т. Д. И указать безопасность и приложение по умолчанию для работы с таким объектом, когда вы открываете их из любого другого приложения.
источник
Одно отличие состоит в том, что у поставщиков контента есть поддержка платформ для наблюдателей контента. Вам нужно будет реализовать свой собственный шаблон Observable для базы данных SQLite.
Как автоматически выполнять повторный запрос с помощью LoaderManager
ContentObserver для SQLite?
источник