赞
踩
ContentProvider 是 Android 中四大组件之一,主要用于在不同应用之间共享数据。ContentProvider 提供了一个一致的接口,使得应用能够以一种受控和安全的方式访问和修改存储的数据。通过 ContentProvider,数据可以被跨进程共享,而不必将数据直接暴露给其他应用。
一个典型的 ContentProvider 包括以下几个部分:
query
、insert
、update
和 delete
。要实现一个 ContentProvider,需要继承 ContentProvider
类并实现其抽象方法。以下是一个简单的示例:
首先,需要创建一个 SQLite 数据库来存储数据。
public class DatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "example.db"; private static final int DATABASE_VERSION = 1; public static final String TABLE_NAME = "example"; public static final String COLUMN_ID = "_id"; public static final String COLUMN_NAME = "name"; private static final String TABLE_CREATE = "CREATE TABLE " + TABLE_NAME + " (" + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COLUMN_NAME + " TEXT);"; public DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(TABLE_CREATE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); onCreate(db); } }
实现 ContentProvider 类并覆盖其方法。
public class ExampleProvider extends ContentProvider { private static final String AUTHORITY = "com.example.provider"; private static final String BASE_PATH = "example"; public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + BASE_PATH); private SQLiteDatabase database; private static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.example.example"; private static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.example.example"; private static final int EXAMPLES = 1; private static final int EXAMPLE_ID = 2; private static final UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); static { uriMatcher.addURI(AUTHORITY, BASE_PATH, EXAMPLES); uriMatcher.addURI(AUTHORITY, BASE_PATH + "/#", EXAMPLE_ID); } @Override public boolean onCreate() { DatabaseHelper helper = new DatabaseHelper(getContext()); database = helper.getWritableDatabase(); return true; } @Nullable @Override public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) { Cursor cursor; switch (uriMatcher.match(uri)) { case EXAMPLES: cursor = database.query(DatabaseHelper.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder); break; case EXAMPLE_ID: cursor = database.query(DatabaseHelper.TABLE_NAME, projection, DatabaseHelper.COLUMN_ID + "=?", new String[]{String.valueOf(ContentUris.parseId(uri))}, null, null, sortOrder); break; default: throw new IllegalArgumentException("Unknown URI: " + uri); } cursor.setNotificationUri(getContext().getContentResolver(), uri); return cursor; } @Nullable @Override public String getType(@NonNull Uri uri) { switch (uriMatcher.match(uri)) { case EXAMPLES: return CONTENT_TYPE; case EXAMPLE_ID: return CONTENT_ITEM_TYPE; default: throw new IllegalArgumentException("Unknown URI: " + uri); } } @Nullable @Override public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) { long id = database.insert(DatabaseHelper.TABLE_NAME, null, values); if (id > 0) { Uri returnUri = ContentUris.withAppendedId(CONTENT_URI, id); getContext().getContentResolver().notifyChange(returnUri, null); return returnUri; } throw new SQLException("Failed to insert row into " + uri); } @Override public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) { int rowsDeleted; switch (uriMatcher.match(uri)) { case EXAMPLES: rowsDeleted = database.delete(DatabaseHelper.TABLE_NAME, selection, selectionArgs); break; case EXAMPLE_ID: rowsDeleted = database.delete(DatabaseHelper.TABLE_NAME, DatabaseHelper.COLUMN_ID + "=?", new String[]{String.valueOf(ContentUris.parseId(uri))}); break; default: throw new IllegalArgumentException("Unknown URI: " + uri); } if (rowsDeleted > 0) { getContext().getContentResolver().notifyChange(uri, null); } return rowsDeleted; } @Override public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) { int rowsUpdated; switch (uriMatcher.match(uri)) { case EXAMPLES: rowsUpdated = database.update(DatabaseHelper.TABLE_NAME, values, selection, selectionArgs); break; case EXAMPLE_ID: rowsUpdated = database.update(DatabaseHelper.TABLE_NAME, values, DatabaseHelper.COLUMN_ID + "=?", new String[]{String.valueOf(ContentUris.parseId(uri))}); break; default: throw new IllegalArgumentException("Unknown URI: " + uri); } if (rowsUpdated > 0) { getContext().getContentResolver().notifyChange(uri, null); } return rowsUpdated; } }
<provider
android:name=".ExampleProvider"
android:authorities="com.example.provider"
android:exported="true" />
Uri uri = Uri.parse("content://com.example.provider/example");
Cursor cursor = getContentResolver().query(uri, null, null, null, null);
if (cursor != null) {
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndexOrThrow("name"));
// 处理数据
}
cursor.close();
}
ContentValues values = new ContentValues();
values.put("name", "Example Name");
Uri uri = Uri.parse("content://com.example.provider/example");
Uri newUri = getContentResolver().insert(uri, values);
ContentValues values = new ContentValues();
values.put("name", "Updated Name");
Uri uri = Uri.parse("content://com.example.provider/example/1");
int rowsUpdated = getContentResolver().update(uri, values, null, null);
Uri uri = Uri.parse("content://com.example.provider/example/1");
int rowsDeleted = getContentResolver().delete(uri, null, null);
ContentProvider 是 Android 中用于数据共享和跨进程通信的重要组件,通过统一的接口和标准化的 URI 访问方式,提供了安全、封装和
欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。