content provider 内容提供者,这是四大组件之一。之前由于数据库部分没有弄好,所以对这一部分的学习只是看了一下,感觉不是很深刻。
代码,还是必须要不断的敲才有有感受,最好是能够知道怎么敲,如果实在不行,抄一遍也比光看有效果。
跨程序共享数据,推荐用contentprovider这个组件。
新建一个类,继承自contentprovider,必须实现六个方法,oncreate、query、insert、update、delete、getType。具体描述看书上p278页。
每个方法都有uri这个参数,这个参数是通过调用contentresolver传递进来的。一个标准的Uri一般是content://com.example.app.provider/table1
表示访问这个app应用的table1表中的数据。接着需要用urimatcher来匹配内容URI的功能,传入权限、路径、自定义代码。
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_ITEM);
uriMatcher.addURI("com.example.app.provider ", "table2/#", TABLE2_ITEM);
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
switch (uriMatcher.match(uri)) {
case TABLE1_DIR:
// 查询table1表中的所有数据
break;
case TABLE1_ITEM:
// 查询table1表中的单条数据
break;
case TABLE2_DIR:
// 查询table2表中的所有数据
break;
case TABLE2_ITEM:
// 查询table2表中的单条数据
break;
default:
break;
}
当传入uri的时候,调用query方法时,会用match方法,看会返回什么代码,然后执行相应的操作。
相当于是一个正面清单的作用,我只规定能访问的数据,如果隐私数据,则不用adduri来对这些数据添加到contenprovider中
这就起到了安全机制的作用。
还需要在manifest.xml注册。
另外建立一个app,在里面通过contentresolve来读取数据。
addData.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 添加数据
Uri uri = Uri.parse("content://com.example.databasetest.
provider/book");
ContentValues values = new ContentValues();
values.put("name", "A Clash of Kings");
values.put("author", "George Martin");
values.put("pages", 1040);
values.put("price", 22.85);
Uri newUri = getContentResolver().insert(uri, values);
newId = newUri.getPathSegments().get(1);
}
});