Приведи пример использования ContentProvider

Ответ

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")
    }
}

Для создания своего провайдера нужно:

  1. Наследоваться от ContentProvider
  2. Реализовать CRUD методы
  3. Объявить в манифесте с authorities
  4. Определить 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")
    }
}

Всё, приложение-сосед получило список контактов, даже не спрашивая, как они там внутри хранятся. Удобно, блядь! Ёперный театр, просто и элегантно.

А теперь, если тебе самому такой провайдер запилить, чтоб твоими данными другие приложения пользовались, вот тебе план, чувак:

  1. Наследоваться от ContentProvider. Это как получить мандат «я официальная тумбочка». Без этого — пидарас шерстяной, а не провайдер.
  2. Реализовать CRUD методы. query, insert, update, delete. Это типа правила: что можно брать, что класть, что менять, что выкидывать. Если не реализовать — будет пиздопроебибна, приложение упадёт при первом же обращении.
  3. Объявить в манифесте с authorities. Это уникальный адрес твоей «тумбочки». Типа com.vasya.pupkin.provider. Если не указать или спутать — система просто не найдет, куда стучаться, доверия ебать ноль.
  4. Определить URI схему через UriMatcher. Это самое важное! Ты же не одну тумбочку даёшь, у тебя там могут быть ящички: один для пользователей, другой для заказов. UriMatcher — это такой швейцар, который смотрит на URI (адрес запроса) и говорит: «Ага, это запрос к таблице users, id=5». Без этого всё полетит к хуям, и вместо заказов будут возвращаться пользователи. Подозрение ебать чувствую, что многие на этом обжигаются.

Короче, идея-то охуенная: инкапсулировать данные и дать к ним безопасный доступ. Но реализация... Ебать мои старые костыли, нужно столько boilerplate-кода написать, что иногда проще через что-то другое общаться. Но если надо по-честному, по-взрослому — то это твой выбор, хуй с горы!