Ответ
ContentProvider используется для обмена данными между приложениями. Пример - доступ к контактам:
// URI для доступа к контактам
val CONTENT_URI = ContactsContract.Contacts.CONTENT_URI
val PROJECTION = arrayOf(
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME
)
// Запрос через ContentResolver
val cursor = contentResolver.query(
CONTENT_URI,
PROJECTION,
null,
null,
null
)
cursor?.use {
while (it.moveToNext()) {
val id = it.getLong(0)
val name = it.getString(1)
Log.d("Contacts", "ID: $id, Name: $name")
}
}
Для создания своего провайдера нужно:
- Наследоваться от ContentProvider
- Реализовать CRUD методы
- Объявить в манифесте с authorities
- Определить URI схему через UriMatcher
Ответ 18+ 🔞
Да ты посмотри, какой прикол! ContentProvider — это ж типа общая тумбочка в коммуналке, куда все соседи могут заглянуть, если договорились. Ну, как доступ к контактам в телефоне. Одно приложение лежит, другое приходит: «Слышь, дай глянуть твою адресную книжку». И если права есть — пожалуйста, на, смотри.
Вот смотри, как это примерно выглядит, чтоб контакты пошарить:
// URI для доступа к контактам
val CONTENT_URI = ContactsContract.Contacts.CONTENT_URI
val PROJECTION = arrayOf(
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME
)
// Запрос через ContentResolver
val cursor = contentResolver.query(
CONTENT_URI,
PROJECTION,
null,
null,
null
)
cursor?.use {
while (it.moveToNext()) {
val id = it.getLong(0)
val name = it.getString(1)
Log.d("Contacts", "ID: $id, Name: $name")
}
}
Всё, приложение-сосед получило список контактов, даже не спрашивая, как они там внутри хранятся. Удобно, блядь! Ёперный театр, просто и элегантно.
А теперь, если тебе самому такой провайдер запилить, чтоб твоими данными другие приложения пользовались, вот тебе план, чувак:
- Наследоваться от ContentProvider. Это как получить мандат «я официальная тумбочка». Без этого — пидарас шерстяной, а не провайдер.
- Реализовать CRUD методы.
query,insert,update,delete. Это типа правила: что можно брать, что класть, что менять, что выкидывать. Если не реализовать — будет пиздопроебибна, приложение упадёт при первом же обращении. - Объявить в манифесте с authorities. Это уникальный адрес твоей «тумбочки». Типа
com.vasya.pupkin.provider. Если не указать или спутать — система просто не найдет, куда стучаться, доверия ебать ноль. - Определить URI схему через UriMatcher. Это самое важное! Ты же не одну тумбочку даёшь, у тебя там могут быть ящички: один для пользователей, другой для заказов. UriMatcher — это такой швейцар, который смотрит на URI (адрес запроса) и говорит: «Ага, это запрос к таблице users, id=5». Без этого всё полетит к хуям, и вместо заказов будут возвращаться пользователи. Подозрение ебать чувствую, что многие на этом обжигаются.
Короче, идея-то охуенная: инкапсулировать данные и дать к ним безопасный доступ. Но реализация... Ебать мои старые костыли, нужно столько boilerplate-кода написать, что иногда проще через что-то другое общаться. Но если надо по-честному, по-взрослому — то это твой выбор, хуй с горы!