标签:
独占 共享
XML 文本 二进制文件 数据量大(数据库,开源) 这些都是进程独享的 / Content Provider 可以进程共享
1.extends ContentProvider,并重写以下方法
public boolean onCreate()
public Uri insert(Uri uri, ContentValues values)
public int delete(Uri uri, String selection, String[] selectionArgs)
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
public String getType(Uri uri)
2 manifest中对<provider>配置,采用authorities(主机名)唯一标识
<provider android:name=".PersonContentProvider" android:authorities="cn.itcast.provider.personprovider"/>
**ContentProvider(内容提供者)的Scheme为content://
Uri要操作的数据;路径(path)
**要操作的数据不一定来自数据库,也可以是文件等他存储方式
用于操作Uri的工具类:UriMatcher和ContentUris
UriMatcher
a.注册需要匹配的Uri路径
//UriMatcher.NO_MATCH——不匹配任何路径的返回码
UriMatcher mMatcher = new UriMatcher(UriMatcher.NO_MATCH);
sMatcher.addURI(“cn.itcast.provider.personprovider”, “person/#”, 2);
** cn.itcast.provider.personprovider 主机唯一标识
person 表名 # 通配符
2 匹配码
b.用mMatcher.match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配码(可用switch-case进行判断)
private static final UriMatcher sURLMatcher = new UriMatcher(
UriMatcher.NO_MATCH);
static {
sURLMatcher.addURI("com.android.alarmclock", "alarm", ALARMS);
sURLMatcher.addURI("com.android.alarmclock", "alarm/#", ALARMS_ID);
}
ContentUris
获取Uri路径后面的ID部分,它有两个比较实用的方法
withAppendedId(uri, id)用于为路径加上ID部分:
Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person")
Uri resultUri = ContentUris.withAppendedId(uri, 10);
**生成后的Uri为:content://cn.itcast.provider.personprovider/person/10
parseId(uri)方法用于从路径中获取ID部分:
Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person/10")
long personid = ContentUris.parseId(uri);
**获取的结果为:10
使用ContentResolver操作ContentProvider中的数据
1.想让外部其他应用能够对本应用进行增删改查,就覆盖ContentProvider的insert(),delete(),update(),query()方法。
2.外部应用访问ContentProvider,通过ContentResolver调用ContentProvider内部的增删改查方法来进行修改查询数据,也就是调用覆盖过的insert(),delete(),update(),query()这些方法。
**ContentProvider在第一次访问时才创建。
//允许其他应用向内容提供者插入数据
@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
switch (MATCHER.match(uri)) {
case 1:
long rowId =db.insert("person", "name", values); //"name"防止values为null
Uri appenduri =ContentUris.withAppendedId(uri, rowId); //根据id构造新的uri
return appenduri;
//传入参数uri错误
default:
throw new IllegalArgumentException("unkown uri");
}
}
//其他应用
public void testInsert() {
Uri uri = Uri.parse("");
ContentResolver resolver = this.getContext().getContentResolver();
ContentValues values = new ContentValues();
values.put("name", "lyj");
values.put("phone", "15032325144");
// 访问内容提供者的insert方法=>也就是调用PersonProvider的insert(Uri uri, ContentValues values)方法
resolver.insert(uri, values);
}
3 提取路径uri中的id
ContentUris.parseId(uri)
*星号代表所有字符 #警号代表数字
监听ContentProvider中内容变化
A应用向ContentProvider添加一条数据,ContentProvider发出数据变化通知,B应用监听ContentProvider的变化,此时B应用就知道ContentProvider发生变化。
@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
switch (MATCHER.match(uri)) {
case 1:
long rowId = db.insert("person", "name", values); // "name"防止values为null
Uri appenduri = ContentUris.withAppendedId(uri, rowId); // 根据id构造新的uri
this.getContext().getContentResolver().notifyChange(uri, null);//发出数据变化通知
return appenduri;
// 传入参数uri错误
default:
throw new IllegalArgumentException("unkown uri");
}
}
标签:
原文地址:http://www.cnblogs.com/liyuejiao/p/4251709.html