← Назад к вопросам

Что позволяет делать ContentProvider?

2.2 Middle🔥 101 комментариев
#Android компоненты#Работа с данными

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

ContentProvider — обмен данными между приложениями

ContentProvider предоставляет безопасный доступ к данным приложения через URI интерфейс. Это стандартный механизм для обмена данными между приложениями и системой.

Основные функции

  • Делиться данными между приложениями
  • Управлять доступом через permissions
  • Предоставить единый интерфейс через ContentResolver
  • Кешировать и синхронизировать данные

URI структура

// content://authority/path/id
val allContacts = "content://com.android.contacts/contacts"
val contact = "content://com.android.contacts/contacts/123"
val photos = "content://media/external/images/media"

Создание провайдера

class UserContentProvider : ContentProvider() {
    private lateinit var db: SQLiteDatabase
    
    override fun onCreate(): Boolean {
        db = UserDatabaseHelper(context!!).writableDatabase
        return true
    }
    
    override fun query(uri: Uri, projection: Array<String>?,
        selection: String?, selectionArgs: Array<String>?,
        sortOrder: String?): Cursor? {
        return db.query("users", projection, selection, selectionArgs,
            null, null, sortOrder)
    }
    
    override fun insert(uri: Uri, values: ContentValues?): Uri? {
        val id = db.insert("users", null, values)
        return Uri.withAppendedPath(uri, id.toString())
    }
    
    override fun update(uri: Uri, values: ContentValues?,
        selection: String?, selectionArgs: Array<String>?): Int {
        return db.update("users", values, selection, selectionArgs)
    }
    
    override fun delete(uri: Uri, selection: String?,
        selectionArgs: Array<String>?): Int {
        return db.delete("users", selection, selectionArgs)
    }
    
    override fun getType(uri: Uri): String = "vnd.android.cursor.dir/user"
}

Использование

val uri = Uri.parse("content://com.example.app/users")

contentResolver.query(uri, null, null, null, null)?.use { cursor ->
    while (cursor.moveToNext()) {
        println(cursor.getString(0))
    }
}

contentResolver.insert(uri, ContentValues().apply {
    put("name", "John")
})

contentResolver.update(Uri.withAppendedPath(uri, "1"),
    ContentValues().apply { put("email", "john@example.com") },
    null, null)

contentResolver.delete(Uri.withAppendedPath(uri, "1"), null, null)

Встроенные провайдеры

contentResolver.query(ContactsContract.Contacts.CONTENT_URI,
    null, null, null, null)
contentResolver.query(Uri.parse("content://sms/inbox"),
    null, null, null, null)
contentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
    null, null, null, null)
contentResolver.query(CalendarContract.Events.CONTENT_URI,
    null, null, null, null)

Best Practices

  • Используйте UriMatcher для маршрутизации
  • Проверяйте permissions
  • Кешируйте данные
  • Используйте transactions
  • Документируйте структуру URI