码迷,mamicode.com
首页 > 其他好文 > 详细

使用ContentProvider共享数据

时间:2015-01-27 00:16:14      阅读:275      评论:0      收藏:0      [点我收藏+]

标签:

独占 共享

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在第一次访问时才创建。

//允许其他应用向内容提供者插入数据
@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");
  }
}

 

使用ContentProvider共享数据

标签:

原文地址:http://www.cnblogs.com/liyuejiao/p/4251709.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!