当前位置 博文首页 > 庆述倾述:ContentProvider内容提供者

    庆述倾述:ContentProvider内容提供者

    作者:[db:作者] 时间:2021-08-05 12:47

    如果一个应用程序通过ContentProvider对其数据提供了外部访问接口,那么任何其他应用程序都可以对这部分数据进行访问。

    类似于数据库的操作进行数据的访问。在ContentProvider中使用URI来进行标识。比如:

    Uri uri = Uri.parse("content://com.example.app.provider/table1");
    

    观察上面的Uri知道它可以清楚的表达我们想要访问哪个程序,哪个表中的数据。在ContentProvider进行访问或者共享自己数据的时候,需要使用ContentResolver类来进行操作,这个操作就类似于前面数据库的CRUD操作。

    我们知道Android自带的通讯录、短信、媒体库等程序都提供了类似的访问接口。那么不妨以访问通讯录为案例:

    1. 简单案例

    ① 添加权限;

    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    

    ② 动态权限申请、数据获取:

    public class TestActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_test);
            Button button = findViewById(R.id.id_button_insert);
            
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //权限检查
                    if (ContextCompat.checkSelfPermission(TestActivity.this,
                            Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
                        //申请权限
                        ActivityCompat.requestPermissions(TestActivity.this,
                                new String[]{Manifest.permission.READ_CONTACTS}, 1);
                    }
                    readAccount();
                }
            });
    
        }
    
        private void readAccount() {
            Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                    null, null, null, null, null);
            while(cursor.moveToNext()){
                String name = cursor.getString(cursor.getColumnIndex(
                        ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
                ));
                String number = cursor.getString(cursor.getColumnIndex(
                        ContactsContract.CommonDataKinds.Phone.NUMBER
                ));
                Toast.makeText(getApplicationContext(),
                        "name="+name+" number="+number, Toast.LENGTH_LONG).show();
            }
            cursor.close();
        }
    
    
        @Override
        public void onRequestPermissionsResult(int requestCode,
                                               @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            if(requestCode == 1){
                if(grantResults.length < 0
                        || grantResults[0] == PackageManager.PERMISSION_DENIED){
                    Toast.makeText(getApplicationContext(),
                            "You denied the premission!", Toast.LENGTH_LONG).show();
                }
            }
        }
    }
    

    2. 自定义ContentProvider共享本应用数据

    1. 定义一个类继承ContentProvider类;
    2. 复写其6个方法;

    在这里插入图片描述

    对于URI有几种写法:

    • content://com.example.app.provider/table1标识到该应用的具体表名;
    • content://com.example.app.provider/table1/1标识到该应用具体表的id1的数据;
    • content://com.example.app.provider/*标识到该应用下的任意表;
    • content://com.example.app.provider/table1/#标识到该应用table1表下的任意一条数据;

    ①创建一个MyContentProvider用于暴露自己的共享数据:

    public class MyContentProvider extends ContentProvider {
        private static UriMatcher uriMatcher;
        private SQLiteDatabase db;
        private static final String tableName = "Book";
        @Override
        public boolean onCreate() {
            MySQLiteOpenHelper mySQLiteOpenHelper = new MySQLiteOpenHelper(getContext(), tableName, null, 3);
            db = mySQLiteOpenHelper.getWritableDatabase();
            return true; // true表示初始化成功,false表示初始化失败
        }
    
        static {
            uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
            uriMatcher.addURI("com.weizu.send_message.provider", "table", 0);
            uriMatcher.addURI("com.weizu.send_message.provider", "table/#", 1);
        }
    
        @Nullable
        @Override
        public Cursor query(@NonNull Uri uri, @Nullable String[] projection,
                            @Nullable String selection, @Nullable String[] selectionArgs,
                            @Nullable String sortOrder) {
            Log.d("TAG", "query: " + String.valueOf(uriMatcher.match(uri)));
            switch (uriMatcher.match(uri)){
                case 0:
                    // 查询table1的所有数据
                    return db.query(tableName, projection, selection, selectionArgs, null, null, sortOrder);
                case 1:
                    // 查询单条数据
                    String id = uri.getPathSegments().get(1);
                    return db.query(tableName, projection, "id = ?", new String[]{id}, null, null, sortOrder);
            }
            return null;
        }
    
        @Nullable
        @Override
        public String getType(@NonNull Uri uri) {
            if(uriMatcher.match(uri) == 1){
                return "vnd.android.cursor.item/vnd.com.weizu.send_message.provider.table";
            }
            return "vnd.android.cursor.dir/vnd.com.weizu.send_message.provider.table";
        }
    
        @Nullable
        @Override
        public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
            long insert = db.insert(tableName, null, values);
            return Uri.parse("content://com.weizu.send_message.provider/table/"+insert);
        }
    
        @Override
        public int delete(@NonNull Uri uri, @Nullable String selection,
                          @Nullable String[] selectionArgs) {
            if(uriMatcher.match(uri) == 0){
                return db.delete(tableName, selection, selectionArgs);
            }
            String bookId = uri.getPathSegments().get(1);
            return db.delete(tableName, "id = ?", new String[]{bookId});
        }
    
        @Override
        public int update(@NonNull Uri uri, @Nullable ContentValues values,
                          @Nullable String selection,
                          @Nullable String[] selectionArgs) {
            if(uriMatcher.match(uri) == 0){
                return db.update(tableName, values, selection, selectionArgs);
            }
            String bookId = uri.getPathSegments().get(1);
            return db.update(tableName, values, "id = ?", new String
    
    下一篇:没有了