Страницы

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

четверг, 1 ноября 2018 г.

Что такое ContentProvider?

Я правильно понимаю что ContentProvider это некая сущность которая позволяет обращяться к Sql через URI или через специальный интерфейс ContentProvider.
Также она позволяет решать могут ли другие приложения обращяться к базе данных внутри данного приложение если стоит значение exported true?
И еще вопрос когда мы используем SqliteDatabaseHelper мы получается используем ContentProvider программно?
ни как не могу найти нормальную статью или объяснение это сущности ContentProvider!
Везде говорится как его использовать, но нигде нет инфы конкретно что это такое.


Ответ

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 программно?
нет.

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

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