当前位置:操作系统 > 安卓/Android >>

Android学习笔记---监听ContentProvider(内容共享者)中数据的变化

2013-03-16
监听ContentProvider中数据的变化
------------------------------------------
1.如果ContentProvider的访问者需要得知ContentProvider中的数据发生了变化,可以在
 
 
ContentProvider 发生数据变化时调用getContentResolver().notifyChange(uri, null)来
 
 
通知注册在此URI上的访问者,例子如下:
public class PersonContentProvider extends ContentProvider {
public Uri insert(Uri uri, ContentValues values) {
db.insert("person", "personid", values);
getContext().getContentResolver().notifyChange(uri, null);
}
}
如果ContentProvider的访问者需要得到数据变化通知,必须使用ContentObserver对数据(
 
 
数据采用uri描述)进行监听,当监听到数据变化通知时,系统就会调用ContentObserver的
 
 
onChange()方法:
getContentResolver().registerContentObserver(Uri.parse
 
 
("content://cn.itcast.providers.personprovider/person"),
        true, new PersonObserver(new Handler()));
public class PersonObserver extends ContentObserver{
public PersonObserver(Handler handler) {
super(handler);
  }
public void onChange(boolean selfChange) {
   //此处可以进行相应的业务处理
}
}
--------------------------------------------------------
2.应用场景,有两个应用,
  A应用       B应用
      ContentProvider
  A,B两个应用都需要访问ContentProvider,A应用首先会往ContentProvider
  中添加一条数据,B应用需要立刻得到A应用添加进去的这条数据,这时候
  需要用到:监听ContentProvider中数据的变化,当A应用往ContentProvider中添加
  数据的时候,ContentProvider会发出数据变化通知,这时候,B应用通过监听就可以得知这个
  变化通知;
---------------------------------------------
3.使用ContentResolver对ContentProvider中的数据进行添加、删除、修改和查询操作:
ContentResolver resolver =  getContentResolver();
Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person");
//添加一条记录
ContentValues values = new ContentValues();
values.put("name", "itcast");
values.put("age", 25);
resolver.insert(uri, values); 
//获取person表中所有记录
Cursor cursor = resolver.query(uri, null, null, null, "personid desc");
while(cursor.moveToNext()){
Log.i("ContentTest", "personid="+ cursor.getInt(0)+ ",name="+ 
 
 
cursor.getString(1));
}
//把id为1的记录的name字段值更改新为liming
ContentValues updateValues = new ContentValues();
updateValues.put("name", "liming");
Uri updateIdUri = ContentUris.withAppendedId(uri, 2);
resolver.update(updateIdUri, updateValues, null, null);
//删除id为2的记录
Uri deleteIdUri = ContentUris.withAppendedId(uri, 2);
resolver.delete(deleteIdUri, null, null);
-----------------------------------------------------------------
4.下面是详细代码:
   a.首先:在ContentProviderDBSQLIte项目中的PersonProvider.java类中修改,insert方法
     /ContentProviderDBSQLIte/src/com/credream/db/PersonProvider.java
-------------------------------
//可以供外部的应用查询,往内容提供者中插入数据
//ContentValues用于存放各个字段的值
@Override
public Uri insert(Uri uri, ContentValues values)
{
//往数据库中插入数据
SQLiteDatabase db=dbOpenHelter.getWritableDatabase();
switch(MATCHER.match(uri)){
case 1:
long rowid=db.insert("person", "name", values);//行号,如
 
 
果主键是整形的,并且是增长的话,那么这个是值就是主键值;
//第二个参数,外面values如果传一个null,或者是空集合,这时候
 
 
第二个参数采用的上,给一个默认值
//返回的事uri
 
 
 
//content://com.credream.providers.personprovider/person/10
//第一种获得这一行的uri的方法
//Uri insertUri=Uri.parse
 
 
("content://com.credream.providers.personprovider/person/"+rowid);
//content://com.credream.providers.personprovider/person/
//第二种获得这一行的uri的方法
Uri insertUri=ContentUris.withAppendedId(uri, rowid);
 this.getContext().getContentResolver().notifyChange(uri, 
 
 
null);//发出数据变化通知,B应用可以得到这个通知
          //notifyChange(uri, observer)//第一个参数,uri是要发生数据变化的来源uri,
 //第二个参数,数据变化的监听者,可以不设置,也即是设为null,如果给
 
 
定了这个监听者,不管外面有多少个应用要设置监听,进行监听数据变化
 //这个getContentResolver()监听对象,必然会得到数据的变化通知
 
return insertUri;
//break;//ResNo不是行号,
default:
throw new IllegalArgumentException("this is Unknow 
 
 
Uri"+uri);
}
}
-------------------------------------------------------
b.创建Bapp项目,该项目是拷贝于OherFile项目,然后修改该项目的OherFileActivity.java类
----------------------------------------------------------------
/Bapp/src/com/credream/otherfile/OherFileActivity.java
package com.credream.otherfile;
 
 
 
 
import android.app.Activity;
 
 
import android.content.ContentResolver;
 
 
import android.content.Context;
 
 
import android.database.ContentObserver;
 
 
import android.database.Cursor;
 
 
import android.net.Uri;
 
 
import android.os.Bundle;
 
 
import android.os.Handler;
 
 
import android.util.Log;
 
 
 
 
public class OherFileActivity extends Activity {
  
 static final String TAG="OherFileActivity";
 
/** Called when the activity is first created. */
    @Override
   
 public void onCreate(Bundle savedInstanceState) {
        super.onCreate
 
 
(savedInstanceState);
       
 setContentView(R.layout.main);
 
 
 //注册数据变化监听器
        
Uri uri=Uri.parse("content://com.credream.providers.personprovider/person");
      
 
 
this.getContentResolver().registerContentObserver(uri, true, new 
 补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,