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; @Override public boolean onCreate() { mDatabaseHelper = new DatabaseHelper(getContext()); return true; } @Override 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; } @Override public String getType(Uri uri) { return ContentResolver.CURSOR_DIR_BASETYPE + "/" + TABLE_NAME; } @Override 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); } @Override 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; } @Override 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); } @Override 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" + ");"); } @Override 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()
— используется для удаления данных из контент-провайдера
Другие вопросы с собеседований.