第十三周安卓开发学习总结(1)

写在前面

最近事情多了起来,趁还有点闲工夫,学习了安卓四大组件的最后一个组件——ContentProvider,内容提供者。内容提供者的作用就是将自己的数据库暴露给别的APP,让别的APP可以操作。应用场景其实比较有限,所以之前没有学习。常见的应用场景有,微信提取联系人目录,各种商城APP自动添加提醒日程等等。大部分都是与系统的APP进行交互,从而实现一些比较方便的功能。比如刚截了一张屏QQ就会提示你有新图片要发,就是使用了ContentProvider来实现的。

ContentProvider的基本使用

要将自己的数据库暴露出去,首先要有一个数据库。使用Sqlite的方法这里就不再赘述了。建立好数据库后,设置内容提供者:

public class UserProvider extends ContentProvider {

    private static final String TAG = "UserProvider";
    private UserDatabaseHelper mUserDatabaseHelper=null;
    private static final int USER_MATCH_CODE = 1;
    private static UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    static {
        sUriMatcher.addURI("com.androidlearing.contentpeovider","user",USER_MATCH_CODE);
    }
    @Override
    public boolean onCreate() {
        mUserDatabaseHelper = new UserDatabaseHelper(getContext());
        return false;
    }

    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
        int result = sUriMatcher.match(uri);
        if(result==USER_MATCH_CODE){
            //匹配规则
            SQLiteDatabase db = mUserDatabaseHelper.getReadableDatabase();
            Cursor cursor = db.query(Constants.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
            return cursor;
        }else{
            //不匹配规则
            throw new IllegalArgumentException("参数错误");
        }

    }

    @Nullable
    @Override
    public String getType(@NonNull Uri uri) {
        return null;
    }

    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
        int result = sUriMatcher.match(uri);
        if(result==USER_MATCH_CODE){
            SQLiteDatabase db = mUserDatabaseHelper.getWritableDatabase();
            long id = db.insert(Constants.TABLE_NAME, null, values);
            Uri resultUri =Uri.parse("content://com.androidlearing.contentpeovider/user/"+id);
            Log.d(TAG,"insert user result -->"+id);
            //插入数据成功,数据已经变化,通知其他地方
            getContext().getContentResolver().notifyChange(resultUri,null);
            return resultUri;
        }else{
            throw new IllegalArgumentException("参数错误!");
        }
    }

    @Override
    public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
        return 0;
    }

    @Override
    public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
        return 0;
    }
}

这里只复写了query和insert方法,其他的方法也大致相同,就不再写了。
四大组件都需要在配置文件中注册,内容提供者也是。我们注册一下:

 <provider
            android:exported="true"
            android:authorities="com.androidlearing.contentpeovider;userProvider"
            android:name=".provider.UserProvider"/>

之后我们再写一个第三方应用来操作该应用的数据库,也就是ContentResolver:

/**
     * 点击的时候我们去获取
     * @param v
     */
    public void getRemoteUsers(View v){
        ContentResolver contentResolver = getContentResolver();
        Uri uri = Uri.parse("content://com.androidlearing.contentpeovider");
        Cursor cursor = contentResolver.query(uri, null, "username = ?", new String[]{"fuck"}, null);
        String[] columnNames = cursor.getColumnNames();
        for(String columnName:columnNames){
            Log.d(TAG,"columnName -->"+columnName);
        }
        while(cursor.moveToNext()){
            for(String columnName: columnNames){
                String value = cursor.getString(cursor.getColumnIndex(columnName));
                Log.d(TAG,"=================");
                Log.d(TAG,columnName+"======="+value);
            }
            Log.d(TAG,"=================");
        }
        cursor.close();
    }

这里的uri里的路径要跟我们之前设置的一致。经过测试无误。

总结

内容提供者的基本内容就到这了。这周如果有时间会做几个案例试试,学习一下具体的使用场景。

原文地址:https://www.cnblogs.com/wushenjiang/p/12872542.html