Почему был создан Android ContentProvider?

11

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

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

satur9nine
источник

Ответы:

6

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

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

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

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

Ален Паннетье
источник
1
Я думаю, что изоляция, вероятно, лучший ответ. Я не согласен с вашей точкой зрения о параллельном доступе, SQLite и Java-интерфейс Android управляют параллелизмом, сам ContentProvider позволяет нескольким одновременным потокам запрашивать / вставлять / обновлять, поэтому он ничего не делает для вас.
satur9nine
3

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

Алекс Локвуд
источник
Сторонние организации всегда могут напрямую получить доступ к файлу базы данных, при этом не требуется межпроцессное взаимодействие.
satur9nine
Я не уверен, что вы имеете в виду ... если приложение является "сторонним", то по определению оно должно существовать в отдельном процессе (поскольку каждое приложение Android имеет свой собственный основной процесс). Кроме того, если бы ОС Android позволяла вам иметь прямой доступ к хранилищам необработанных данных других приложений, это вызвало бы некоторые довольно серьезные проблемы с безопасностью.
Алекс Локвуд
1

ContentProvider также является абстракцией, которая скрывает детали того, как данные хранятся / генерируются. Например, в одном из моих приложений у меня есть поставщик контента, который возвращает изображения в формате PNG. Эти изображения нигде не хранятся, они создаются по запросу.

Дэн Дайер
источник