首页 > 代码库 > 使用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(内容提供者)Schemecontent://

 

Uri要操作的数据;路径(path)

**要操作的数据不一定来自数据库,也可以是文件等他存储方式

 

用于操作Uri的工具类:UriMatcherContentUris

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.想让外部其他应用能够对本应用进行增删改查,就覆盖ContentProviderinsert(),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共享数据