IT评测·应用市场-qidao123.com技术社区

标题: 深入分析 Android ContentProvider (一) [打印本页]

作者: 金歌    时间: 2024-7-26 12:49
标题: 深入分析 Android ContentProvider (一)
深入分析 Android ContentProvider (一)

1. Android 中的 ContentProvider 设计阐明

ContentProvider 是 Android 中四大组件之一,重要用于在不同应用之间共享数据。ContentProvider 提供了一个一致的接口,使得应用能够以一种受控和安全的方式访问和修改存储的数据。通过 ContentProvider,数据可以被跨进程共享,而不必将数据直接暴露给其他应用。
1.1. ContentProvider 的设计初衷

1.2. ContentProvider 的基本结构

一个典型的 ContentProvider 包括以下几个部分:
1.3. ContentProvider 的实现

要实现一个 ContentProvider,须要继承 ContentProvider 类并实现其抽象方法。以下是一个简单的示例:
示例:实现一个简单的 ContentProvider

首先,须要创建一个 SQLite 数据库来存储数据。
  1. public class DatabaseHelper extends SQLiteOpenHelper {
  2.     private static final String DATABASE_NAME = "example.db";
  3.     private static final int DATABASE_VERSION = 1;
  4.     public static final String TABLE_NAME = "example";
  5.     public static final String COLUMN_ID = "_id";
  6.     public static final String COLUMN_NAME = "name";
  7.     private static final String TABLE_CREATE =
  8.             "CREATE TABLE " + TABLE_NAME + " (" +
  9.             COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
  10.             COLUMN_NAME + " TEXT);";
  11.     public DatabaseHelper(Context context) {
  12.         super(context, DATABASE_NAME, null, DATABASE_VERSION);
  13.     }
  14.     @Override
  15.     public void onCreate(SQLiteDatabase db) {
  16.         db.execSQL(TABLE_CREATE);
  17.     }
  18.     @Override
  19.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  20.         db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
  21.         onCreate(db);
  22.     }
  23. }
复制代码
实现 ContentProvider 类并覆盖其方法。
  1. public class ExampleProvider extends ContentProvider {
  2.     private static final String AUTHORITY = "com.example.provider";
  3.     private static final String BASE_PATH = "example";
  4.     public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + BASE_PATH);
  5.     private SQLiteDatabase database;
  6.     private static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.example.example";
  7.     private static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.example.example";
  8.     private static final int EXAMPLES = 1;
  9.     private static final int EXAMPLE_ID = 2;
  10.     private static final UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
  11.     static {
  12.         uriMatcher.addURI(AUTHORITY, BASE_PATH, EXAMPLES);
  13.         uriMatcher.addURI(AUTHORITY, BASE_PATH + "/#", EXAMPLE_ID);
  14.     }
  15.     @Override
  16.     public boolean onCreate() {
  17.         DatabaseHelper helper = new DatabaseHelper(getContext());
  18.         database = helper.getWritableDatabase();
  19.         return true;
  20.     }
  21.     @Nullable
  22.     @Override
  23.     public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection,
  24.                         @Nullable String[] selectionArgs, @Nullable String sortOrder) {
  25.         Cursor cursor;
  26.         switch (uriMatcher.match(uri)) {
  27.             case EXAMPLES:
  28.                 cursor = database.query(DatabaseHelper.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
  29.                 break;
  30.             case EXAMPLE_ID:
  31.                 cursor = database.query(DatabaseHelper.TABLE_NAME, projection, DatabaseHelper.COLUMN_ID + "=?",
  32.                         new String[]{String.valueOf(ContentUris.parseId(uri))}, null, null, sortOrder);
  33.                 break;
  34.             default:
  35.                 throw new IllegalArgumentException("Unknown URI: " + uri);
  36.         }
  37.         cursor.setNotificationUri(getContext().getContentResolver(), uri);
  38.         return cursor;
  39.     }
  40.     @Nullable
  41.     @Override
  42.     public String getType(@NonNull Uri uri) {
  43.         switch (uriMatcher.match(uri)) {
  44.             case EXAMPLES:
  45.                 return CONTENT_TYPE;
  46.             case EXAMPLE_ID:
  47.                 return CONTENT_ITEM_TYPE;
  48.             default:
  49.                 throw new IllegalArgumentException("Unknown URI: " + uri);
  50.         }
  51.     }
  52.     @Nullable
  53.     @Override
  54.     public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
  55.         long id = database.insert(DatabaseHelper.TABLE_NAME, null, values);
  56.         if (id > 0) {
  57.             Uri returnUri = ContentUris.withAppendedId(CONTENT_URI, id);
  58.             getContext().getContentResolver().notifyChange(returnUri, null);
  59.             return returnUri;
  60.         }
  61.         throw new SQLException("Failed to insert row into " + uri);
  62.     }
  63.     @Override
  64.     public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
  65.         int rowsDeleted;
  66.         switch (uriMatcher.match(uri)) {
  67.             case EXAMPLES:
  68.                 rowsDeleted = database.delete(DatabaseHelper.TABLE_NAME, selection, selectionArgs);
  69.                 break;
  70.             case EXAMPLE_ID:
  71.                 rowsDeleted = database.delete(DatabaseHelper.TABLE_NAME, DatabaseHelper.COLUMN_ID + "=?",
  72.                         new String[]{String.valueOf(ContentUris.parseId(uri))});
  73.                 break;
  74.             default:
  75.                 throw new IllegalArgumentException("Unknown URI: " + uri);
  76.         }
  77.         if (rowsDeleted > 0) {
  78.             getContext().getContentResolver().notifyChange(uri, null);
  79.         }
  80.         return rowsDeleted;
  81.     }
  82.     @Override
  83.     public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
  84.         int rowsUpdated;
  85.         switch (uriMatcher.match(uri)) {
  86.             case EXAMPLES:
  87.                 rowsUpdated = database.update(DatabaseHelper.TABLE_NAME, values, selection, selectionArgs);
  88.                 break;
  89.             case EXAMPLE_ID:
  90.                 rowsUpdated = database.update(DatabaseHelper.TABLE_NAME, values, DatabaseHelper.COLUMN_ID + "=?",
  91.                         new String[]{String.valueOf(ContentUris.parseId(uri))});
  92.                 break;
  93.             default:
  94.                 throw new IllegalArgumentException("Unknown URI: " + uri);
  95.         }
  96.         if (rowsUpdated > 0) {
  97.             getContext().getContentResolver().notifyChange(uri, null);
  98.         }
  99.         return rowsUpdated;
  100.     }
  101. }
复制代码
  1. <provider
  2.     android:name=".ExampleProvider"
  3.     android:authorities="com.example.provider"
  4.     android:exported="true" />
复制代码
1.4. ContentProvider 的使用

  1. Uri uri = Uri.parse("content://com.example.provider/example");
  2. Cursor cursor = getContentResolver().query(uri, null, null, null, null);
  3. if (cursor != null) {
  4.     while (cursor.moveToNext()) {
  5.         String name = cursor.getString(cursor.getColumnIndexOrThrow("name"));
  6.         // 处理数据
  7.     }
  8.     cursor.close();
  9. }
复制代码
  1. ContentValues values = new ContentValues();
  2. values.put("name", "Example Name");
  3. Uri uri = Uri.parse("content://com.example.provider/example");
  4. Uri newUri = getContentResolver().insert(uri, values);
复制代码
  1. ContentValues values = new ContentValues();
  2. values.put("name", "Updated Name");
  3. Uri uri = Uri.parse("content://com.example.provider/example/1");
  4. int rowsUpdated = getContentResolver().update(uri, values, null, null);
复制代码
  1. Uri uri = Uri.parse("content://com.example.provider/example/1");
  2. int rowsDeleted = getContentResolver().delete(uri, null, null);
复制代码
2. ContentProvider 的设计优势

3. ContentProvider 的留意事项

4. 总结

ContentProvider 是 Android 中用于数据共享和跨进程通信的重要组件,通过同一的接口和标准化的 URI 访问方式,提供了安全、封装和
欢迎点赞|关注|收藏|批评,您的肯定是我创作的动力


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4