内容提供者及内容解析者的实现步骤

一、创建一个类,继承ContentProvider,重写onCreate,query,insert,update,delete,getType方法
二、在清单文件中声明provider节点

<provider
    android:authorities="cn.test.provider"            android:name="cn.test.contactproviderdemo.MyProvider"
    android:exported="true">
provider>

这里需要注意的是:
android:authorities这个字符串相当于是一个拦截器,需要对应的URI匹配上才能访问对应的数据。
另外,在安卓4.4以上的版本中,还需要配置android:exported=”true”
三、通过UriMatcher添加对应的URI匹配规则

private static final UriMatcher sURIMatcher  = new UriMatcher(UriMatcher.NO_MATCH);

    // 这里设置的数字,不为-1,但是最好为正数
    private static final int QUERY_SUCCESS = 1;
    private static final int INSERT_MATCHED = 2;
    private static final int UPDATE_MATCHED = 3;
    private static final int DELETE_MATCHED = 4;

    static {
        // 给当前的URI匹配器添加一条匹配规则
        sURIMatcher.addURI("cn.test.provider", "query", QUERY_SUCCESS);
        sURIMatcher.addURI("cn.test.provider", "insert", INSERT_MATCHED);
        sURIMatcher.addURI("cn.test.provider", "update", UPDATE_MATCHED);
        sURIMatcher.addURI("cn.test.provider", "delete", DELETE_MATCHED);
    }

具体对数据库的增删改查,在这里就不贴代码出来了,接下来,就是其他应用访问这个应用的数据库了。
四、在一个新的工程下面,使用内容解析者获取数据
示例代码:

public void query(View v) {
        // 获取内容解析者
        ContentResolver resolver = getContentResolver();
        Uri uri = Uri.parse("content://cn.test.provider/query");
        Cursor cursor = resolver.query(uri, null, null, null, null);
        while (cursor.moveToNext()) {
            String name = cursor.getString(cursor.getColumnIndex("name"));
            System.out.println("name=" + name);
        }
    }

    public void insert(View v) {
        ContentResolver resolver = getContentResolver();
        Uri uri = Uri.parse("content://cn.test.provider/insert");
        ContentValues values = new ContentValues();
        values.put("name", "二狗子");
        values.put("phone", "489756848");
        values.put("age", 12);
        Uri insert = resolver.insert(uri, values);
        System.out.println(insert);
    }

    public void delete(View v) {
        ContentResolver resolver = getContentResolver();
        Uri uri = Uri.parse("content://cn.test.provider/delete");
        String where = "name = ?";
        String [] selectionArgs = {"大牛"};
        int delete = resolver.delete(uri, where, selectionArgs);
        Toast.makeText(getApplicationContext(), "删除了" + delete + "条数据", Toast.LENGTH_SHORT).show();
    }

    public void update(View v) {
        ContentResolver resolver = getContentResolver();
        Uri uri = Uri.parse("content://cn.test.provider/update");
        ContentValues values = new ContentValues();
        values.put("name", "小二黑");
        String where = "name = ?";
        String [] selectionArgs = {"二狗"};
        int update = resolver.update(uri, values, where, selectionArgs);
        Toast.makeText(getApplicationContext(), "更新了" + update + "条数据", Toast.LENGTH_SHORT).show();
    }

这里又一点需要说明的是,Uri资源的访问,必须加上content://,另外,cn.test.provider对应的是另一个工程再清单文件中android:authorities字段中声明的字符串,后面跟着的字符比如,query,insert,delete等等,是在另一个工程中,在static静态代码块中由UriMatcher对象add进来的匹配规则,如果对应上就会执行相应的方法。

你可能感兴趣的:(安卓)