TechHype
Вопросы с собеседований: Что такое контент-провайдер (Content Provider) в Android
Контент-провайдер (Content Provider) в Android — это компонент, который предоставляет доступ к данным другим приложениям. Он представляет данные в виде таблицы или набора таблиц, похожих на таблицы в реляционной базе данных. Контент-провайдеры используются для совместного использования данных между приложениями, а также для предоставления доступа к данным, которые хранятся в приложении, другим приложениям.
Контент-провайдеры предоставляют стандартизированный интерфейс для доступа к данным. Это означает, что приложения могут легко взаимодействовать с контент-провайдерами, даже если они написаны разными разработчиками.
Они могут использоваться для хранения различных типов данных, включая контакты, календарь, фотографии и другие, в памяти устройства или в базе данных.
Чтобы создать свой провайдер, необходимо реализовать класс, который расширяет класс ContentProvider
. Этот класс должен реализовать несколько методов, которые предоставляют доступ к данным.
Основные методы:
query()
— используется для запроса данных из контент-провайдера.insert()
— используется для вставки данных в контент-провайдер.update()
— используется для обновления данных в контент-провайдер.delete()
— используется для удаления данных из контент-провайдера.
Контент-провайдеры являются важным компонентом Android. Они позволяют приложениям совместно использовать данные и предоставляют доступ к данным, которые хранятся в приложении, другим приложениям.
Вот несколько примеров использования контент-провайдеров:
- Контакты: приложение для контактов может использовать контент-провайдер для хранения контактов. Другие приложения могут использовать этот контент-провайдер для доступа к контактам.
- Календарь: приложение для календаря может использовать контент-провайдер для хранения событий календаря. Другие приложения могут использовать этот провайдер для доступа к событиям календаря.
- Фотографии: приложение для фотографий может использовать контент-провайдер для хранения фотографий. Другие приложения могут использовать этот провайдер для доступа к фотографиям.
Контент-провайдеры — это мощный инструмент, который может использоваться для совместного использования данных между приложениями.
Пример реализации контент-провайдера
Вот пример реализации провайдера, который хранит список контактов:
package com.example.contentprovidersuperexample;
import android.content.ContentProvider;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
import android.util.Log;
public class ContactProvider extends ContentProvider {
private static final String TAG = "ContactProvider";
private static final String DATABASE_NAME = "contacts.db";
private static final int DATABASE_VERSION = 1;
private static final String TABLE_NAME = "contacts";
private static final String COLUMN_ID = "_id";
private static final String COLUMN_NAME = "name";
private static final String COLUMN_PHONE = "phone";
private DatabaseHelper mDatabaseHelper;
public boolean onCreate() {
mDatabaseHelper = new DatabaseHelper(getContext());
return true;
}
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
SQLiteDatabase db = mDatabaseHelper.getReadableDatabase();
Cursor cursor = db.query(TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
}
public String getType(Uri uri) {
return ContentResolver.CURSOR_DIR_BASETYPE + "/" + TABLE_NAME;
}
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
long id = db.insert(TABLE_NAME, null, values);
getContext().getContentResolver().notifyChange(uri, null);
return Uri.parse(uri + "/" + id);
}
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
int count = db.update(TABLE_NAME, values, selection, selectionArgs);
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
public int delete(Uri uri, String selection, String[] selectionArgs) {
SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
int count = db.delete(TABLE_NAME, selection, selectionArgs);
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
private static class DatabaseHelper extends SQLiteOpenHelper {
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + TABLE_NAME + " (" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
COLUMN_NAME + " TEXT NOT NULL," +
COLUMN_PHONE + " TEXT NOT NULL" +
");");
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
}
Этот класс предоставляет доступ к таблице контактов, которая имеет следующие столбцы:
_id
— идентификатор контактаname
— имя контактаphone
— номер телефона контакта
Он реализует основные методы, необходимые для доступа к данным:
query()
— используется для запроса данных из контент-провайдераinsert()
— используется для вставки данных в контент-провайдерupdate()
— используется для обновления данных в контент-провайдерdelete()
— используется для удаления данных из контент-провайдера
Другие вопросы с собеседований.
-
Видео и подкасты для разработчиков3 недели назад
Как устроена мобильная архитектура. Интервью с тех. лидером юнита «Mobile Architecture» из AvitoTech
-
Новости3 недели назад
Видео и подкасты о мобильной разработке 2025.10
-
Новости2 недели назад
Видео и подкасты о мобильной разработке 2025.11
-
Видео и подкасты для разработчиков1 неделя назад
Javascript для бэкенда – отличная идея: Node.js, NPM, Typescript