创建自己的内容提供器ContentProvider

来源:互联网 发布:图片扣字软件 编辑:程序博客网 时间:2024/05/01 19:54

通过新建一个类去继承ContentProvider的方式来创建一个自己的内容提供器,ContentProvider类中有六个抽象方法,其要将其全部重写。新建MyProvider类继承ContentProvider,可以看到已经规定方法:

public class MyProvider extends ContentProvider {    @Override    public int delete(Uri arg0, String arg1, String[] arg2) {        // TODO Auto-generated method stub        return 0;    }    @Override    public String getType(Uri arg0) {        // TODO Auto-generated method stub        return null;    }    @Override    public Uri insert(Uri arg0, ContentValues arg1) {        // TODO Auto-generated method stub        return null;    }    @Override    public boolean onCreate() {        // TODO Auto-generated method stub        return false;    }    @Override    public Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3,            String arg4) {        // TODO Auto-generated method stub        return null;    }    @Override    public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {        // TODO Auto-generated method stub        return 0;    }}

我们标准的URI写法如下:

content://com.example.app.provider/table1

这就表示调用期望访问的是com.example.app这个应用的table1表中的内容,除此之外,还可以在这个内容URI之后加上一个id,

content://com.example.app.provider/table1/1

这就表示期望访问的是com.example.app这个应用中的table表中的id为1的数据。
我们可以使用通配符格式的内容URI:
1. *表示匹配任意长度的任意字符
2. #表示匹配任意长度的数字

接着,我们再借助UriMatcher这个类就可以轻松地实现匹配内容URI的功能:UriMatcher类中提供了一个addURI方法,接收三个参数,可以把权限、路径和自定义代码传进去。修改MyProvider中的代码:

    public static final int TABLE1_DIR = 0;    public static final int TABLE1_ITEM = 1;    public static final int TABLE2_DIR = 2;    public static final int TABLE2_ITEM = 3;    public static UriMatcher uriMatcher;    static {        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);        uriMatcher.addURI("com.example.app.provider", "table1", TABLE1_DIR);        uriMatcher.addURI("com.example.app.provider", "table1/#", TABLE1_ITEM);        uriMatcher.addURI("com.example.app.provider", "table2", TABLE2_DIR);        uriMatcher.addURI("com.example.app.provider", "table2/#", TABLE1_ITEM);    }
    @Override    public Cursor query(Uri uri, String[] projection, String selection,            String[] selectionArgs, String sortOrder) {        // TODO Auto-generated method stub        switch (uriMatcher.match(uri)) {        case TABLE1_DIR:            break;        case TABLE1_ITEM:            break;        case TABLE2_DIR:            break;        case TABLE2_ITEM:            break;        default:            break;        }        return null;    }

可以看到,在静态代码块中,我们传入了四组URI。其中TABLE1_DIR表示访问table1表中数据内容,以此类推。
实现getType方法中的逻辑:

    @Override    public String getType(Uri uri) {        // TODO Auto-generated method stub        switch (uriMatcher.match(uri)) {        case TABLE1_DIR:            return "vnd.android.cursor.dir/"                    + "vnd.com.example.app.provider.table1";        case TABLE1_ITEM:            return "vnd.android.cursor.item/"                    + "vnd.com.example.app.provider.table1";        case TABLE2_DIR:            return "vnd.android.cursor.dir/"                    + "vnd.com.example.app.provider.table2";        case TABLE2_ITEM:            return "vnd.android.cursor.item/"                    + "vnd.com.example.app.provider.table2";        default:            break;        }        return null;    }
0 0
原创粉丝点击