首页 > 代码库 > 使用ContentProvider共享数据
使用ContentProvider共享数据
独占 共享
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在第一次访问时才创建。
//允许其他应用向内容提供者插入数据@Overridepublic 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发生变化。
@Overridepublic 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"); }}
使用ContentProvider共享数据