Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

Что такое ContentProvider?

#android


Я правильно понимаю что ContentProvider это некая сущность которая позволяет обращяться
к Sql через URI или через специальный интерфейс ContentProvider.

Также она позволяет решать могут ли другие приложения обращяться к базе данных внутри
данного приложение если стоит значение exported true?

И еще вопрос когда мы используем SqliteDatabaseHelper мы получается используем ContentProvider
программно?

ни как не могу найти нормальную статью или объяснение это сущности ContentProvider!

Везде говорится как его использовать, но нигде нет инфы конкретно что это такое.
    


Ответы

Ответ 1



ContentProvider - это как следует из его названия провайдер некоего контента. Это необязательно SQL данные - это может быть все что угодно. Например, можно легко представить, что приложение содержит в себе некие данные, ну скажем, приложение игра морской бой и в нем хранятся данные о последних шагах игрока. Теперь стоит задача - высунуть данные о ходах наружу, причем высунуть безопасно. Вот тут то и приходит на помощь ContentProvider. Правила обращения с ContentProvider довольно просты, декларируется Uri типа: content://[authority]/[path] рекомендуется использовать в качестве authority имя пакета с префиксом поясняющим суть провайдера, например для нашего морского боя можно было бы применить: com.my.application.package.seabattledataprovider смысл path - указании собственно самого запроса, здесь пример запроса на получение второго шага в нашей игре: content://com.my.application.package.seabattledataprovider/data?step=2 Синтаксис задания Uri задан документом RFC 2396 и является универсальным, класс Uri поддерживает разбор этого синтаксиса. Для реализации ContentProvider надо написать свой класс наследующий от класса ContentProvider, где основным методом является метод query(), в котором полученный Uri надо распарсить по заданным разработчиком самим правилам и вернуть данные в виде Cursor, который не всегда является SQLiteCursor. Если данные не являются SQL данными, то надо писать собственный класс, который наследует от класса AbstractCursor Теперь, чтобы получить данные из нашей игры в морской бой, надо из любого места (если провайдер экспортирован, то и из любого другого приложения) вызвать: context.getContentResolver("content://com.my.application.package.seabattledataprovider/data?step=2", null, null, null, null); В ответ мы получим курсор с нашими данными. И еще вопрос когда мы используем SqliteDatabaseHelper мы получается используем ContentProvider программно? нет.

Ответ 2



Пользоваться SQL можно и без ContentProvider, как и наличие ContentProvider не обязывает использовать SQL. Мало того, в документации к ContentProvider сказано что пользоваться им нужно только если вы хотите, что бы другие приложения имели доступ к данным из вашего приложения. Иначе - он не нужен, как пруф этих слов приведу цитату из исходников: A content provider is only required if you need to share data between multiple applications. Поставщик контента требуется только в том случае, если вам нужно обмениваться данными между несколькими приложениями. Да, если стоит exported true - то другие приложения, зная uri, могут постучаться к вашему провайдеру.

Комментариев нет:

Отправить комментарий