简介
ContentProvider是Android中提供的专门用于不同应用间数据交互和共享的组件。ContentProvider实际上是对SQLiteOpenHelper的进一步封装,以一个或多个表的形式将数据呈现给外部应用,通过Uri映射来选择需要操作数据库中的哪个表,并对表中的数据进行增删改查处理。ContentProvider其底层使用了Binder来完成APP进程之间的通信,同时使用匿名共享内存来作为共享数据的载体。ContentProvider支持访问权限管理机制,以控制数据的访问者及访问方式,保证数据访问的安全性。
下面看一个简单的例子,它演示了contentProvider的使用。
相关知识
URI(Uniform Resource Identifier)即统一资源标识符,是一个用于标识某一互联网资源名称的字符串。如下是联系人的Uri,其结构如下图:
- schema: Android中固定为content://。
- authority: 用于唯一标识一个ContentProvider。
- path: ContentProvider中数据表的表名。
- id: 数据表中数据的标识,可选字段。
BookProvider.java
public class BookProvider extends ContentProvider { private static final String TAG = BookProvider.class.getSimpleName(); private static final String AUTHORITY = "com.example.abc.book.provider"; public static final Uri BOOK_CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/book"); public static final Uri USER_CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/user"); private static final int BOOK_URI_CODE = 0; private static final int USER_URI_CODE = 1; private SQLiteDatabase mDataBase; private Context mContext; private static final UriMatcher mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); static { mUriMatcher.addURI(AUTHORITY, "book", BOOK_URI_CODE); mUriMatcher.addURI(AUTHORITY, "user", USER_URI_CODE); } @Override public boolean onCreate() { Log.i(TAG, "onCreate"); mContext = getContext(); mDataBase = new BookDbOpenHelper(mContext).getWritableDatabase(); return false; } @Nullable @Override public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) { Log.i(TAG, "query"); String tableName = getTableName(uri); if (tableName == null) { throw new IllegalArgumentException("not find uri:" + uri); } return mDataBase.query(tableName, projection, selection, selectionArgs, null, null, sortOrder, null); } private String getTableName(Uri uri) { String tableMame = null; switch (mUriMatcher.match(uri)) { case BOOK_URI_CODE: tableMame = BookDbOpenHelper.TABLE_BOOK_NAME; break; case USER_URI_CODE: tableMame = BookDbOpenHelper.TABLE_USER_NAME; break; default: break; } return tableMame; } @Nullable @Override public String getType(@NonNull Uri uri) { Log.i(TAG, "getType"); return null; } @Nullable @Override public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) { Log.i(TAG, "insert"); String tableName = getTableName(uri); if (tableName == null) { throw new IllegalArgumentException("not find uri:" + uri); } mDataBase.insert(tableName, null, values); mContext.getContentResolver().notifyChange(uri, null); return null; } @Override public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) { Log.i(TAG, "delete"); String tableName = getTableName(uri); if (tableName == null) { throw new IllegalArgumentException("not find uri:" + uri); } int count = mDataBase.delete(tableName, selection, selectionArgs); if (count > 0) { mContext.getContentResolver().notifyChange(uri, null); } return count; } @Override public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) { Log.i(TAG, "update"); String tableName = getTableName(uri); if (tableName == null) { throw new IllegalArgumentException("not find uri:" + uri); } int row = mDataBase.update(tableName, values, selection, selectionArgs); if (row > 0) { mContext.getContentResolver().notifyChange(uri, null); } return row; } }
BookDbOpenHelper.java
public class BookDbOpenHelper extends SQLiteOpenHelper { private static final String DB_NAME = "book_provider.db"; public static final String TABLE_BOOK_NAME = "book"; public static final String TABLE_USER_NAME = "user"; public static final String FIELD_BOOK_NAME = "BOOK_NAME"; public static final String FIELD_BOOK_PRICE = "PRICE"; public static final String FIELD_USER_NAME = "USER_NAME"; public static final String FIELD_USER_SEX = "SEX"; public static final String FIELD_USER_AGE = "AGE"; private static final int DB_VERSION = 1; private static final String CREATE_BOOK_TABLE = "CREATE TABLE IF NOT EXISTS " + TABLE_BOOK_NAME + "(_ID INTEGER PRIMARY KEY," + FIELD_BOOK_NAME + " TEXT," + FIELD_BOOK_PRICE + " INT)"; private static final String CREATE_USER_TABLE = "CREATE TABLE IF NOT EXISTS " + TABLE_USER_NAME + "(_ID INTEGER PRIMARY KEY," + FIELD_USER_NAME + " TEXT," + FIELD_USER_SEX + " INT," + FIELD_USER_AGE + " INT)"; public BookDbOpenHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_BOOK_TABLE); db.execSQL(CREATE_USER_TABLE); db.execSQL("insert into book values(1,'Android',66)"); db.execSQL("insert into book values(2,'Mysql',76)"); db.execSQL("insert into book values(3,'Ios',176)"); db.execSQL("insert into user values(1,'tom',1,20)"); db.execSQL("insert into user values(2,'jec',1,27)"); db.execSQL("insert into user values(3,'banna',2,70)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
MainActivity.java
public class MainActivity extends AppCompatActivity { private static final String TAG = MainActivity.class.getSimpleName(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Uri bookUri = BookProvider.BOOK_CONTENT_URI; ContentValues contentValues = new ContentValues(); contentValues.put(BookDbOpenHelper.FIELD_BOOK_NAME, "Android开发艺术"); contentValues.put(BookDbOpenHelper.FIELD_BOOK_PRICE, 66); getContentResolver().insert(bookUri, contentValues); Cursor cursorBook = getContentResolver().query(bookUri, new String[]{BookDbOpenHelper.FIELD_BOOK_NAME, BookDbOpenHelper.FIELD_BOOK_PRICE}, null, null, null); while (cursorBook.moveToNext()) { String bookName = cursorBook.getString(cursorBook.getColumnIndex(BookDbOpenHelper.FIELD_BOOK_NAME)); int bookPrice = cursorBook.getInt(cursorBook.getColumnIndex(BookDbOpenHelper.FIELD_BOOK_PRICE)); Log.i(TAG, "bookName:" + bookName + " bookPrice:" + bookPrice); } Cursor cursorUser = getContentResolver().query(BookProvider.USER_CONTENT_URI, new String[]{BookDbOpenHelper.FIELD_USER_NAME, BookDbOpenHelper.FIELD_USER_SEX, BookDbOpenHelper.FIELD_USER_AGE}, null, null, null); while (cursorUser.moveToNext()) { String userName = cursorUser.getString(cursorUser.getColumnIndex(BookDbOpenHelper.FIELD_USER_NAME)); int sex = cursorUser.getInt(cursorUser.getColumnIndex(BookDbOpenHelper.FIELD_USER_SEX)); int age = cursorUser.getInt(cursorUser.getColumnIndex(BookDbOpenHelper.FIELD_USER_AGE)); Log.i(TAG, "userName:" + userName + " sex:" + sex + "age:" + age); } } }
借鉴地址:https://www.jianshu.com/p/94b8582d089a