Android四大组件——ContentProvider

简介

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值