← Назад к вопросам
Что позволяет делать 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