Android开发14——监听内容提供者ContentProvider的数据变化-阿里云开发者社区

开发者社区> 徐胖子> 正文

Android开发14——监听内容提供者ContentProvider的数据变化

简介:   一、提出需求 有A,B,C三个应用,B中的数据需要被共享,所以B中定义了内容提供者ContentProvider;A应用修改了B应用的数据,插入了一条数据。有这样一个需求,此时C应用需要得到数据被修改的通知并处理相应操作。     二、示例代码 A应用 /** * 对内容提供者进行操作 * * @author XY * */ public cla
+关注继续查看

 

一、提出需求

有A,B,C三个应用,B中的数据需要被共享,所以B中定义了内容提供者ContentProvider;A应用修改了B应用的数据,插入了一条数据。有这样一个需求,此时C应用需要得到数据被修改的通知并处理相应操作。

 

 

二、示例代码

A应用
/**
 * 对内容提供者进行操作
 * 
 * @author XY
 * 
 */
public class MainActivity extends Activity
{

	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
	}

	public void insert(View v)
	{
		Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person");
		ContentResolver resolver = this.getContentResolver();
		ContentValues values = new ContentValues();
		values.put("name", "xy_new_new");
		values.put("phone", "xy_new_111");
		resolver.insert(uri, values);
	}
}


B应用
package cn.xy.cotentProvider.app.providers;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.util.Log;
import cn.xy.cotentProvider.service.DBOpeningHelper;

/**
 * @author XY
 * 
 */
public class PersonProvider extends ContentProvider
{
	private DBOpeningHelper dbHelper;

	// 若不匹配采用UriMatcher.NO_MATCH(-1)返回
	private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);

	// 匹配码
	private static final int CODE_NOPARAM = 1;
	private static final int CODE_PARAM = 2;

	static
	{
		// 对等待匹配的URI进行匹配操作,必须符合cn.xyCompany.providers.personProvider/person格式
		// 匹配返回CODE_NOPARAM,不匹配返回-1
		MATCHER.addURI("cn.xyCompany.providers.personProvider", "person", CODE_NOPARAM);

		// #表示数字 cn.xyCompany.providers.personProvider/person/10
		// 匹配返回CODE_PARAM,不匹配返回-1
		MATCHER.addURI("cn.xyCompany.providers.personProvider", "person/#", CODE_PARAM);
	}

	@Override
	public boolean onCreate()
	{
		dbHelper = new DBOpeningHelper(this.getContext());
		return true;
	}

	/**
	 * 外部应用向本应用插入数据
	 */
	@Override
	public Uri insert(Uri uri, ContentValues values)
	{
		SQLiteDatabase db = dbHelper.getWritableDatabase();
		switch (MATCHER.match(uri))
		{
			case CODE_NOPARAM:
				// 若主键值是自增长的id值则返回值为主键值,否则为行号,但行号并不是RecNo列
				long id = db.insert("person", "name", values); 
				Uri insertUri = ContentUris.withAppendedId(uri, id); 
				// 发出变化通知(非必须)设监听者为null。
				// 若设置某个监听者则不管有多少个监听者,该监听者一定可以获得该通知
				getContext().getContentResolver().notifyChange(uri, null); 
				return insertUri;
			default:
				throw new IllegalArgumentException("this is unkown uri:" + uri);
		}
	}
	......
}


C应用
package cn.xt.contentProvider.lisenter;
import android.app.Activity;
import android.content.ContentResolver;
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 MainActivity extends Activity
{
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person");
		ContentResolver resolver = this.getContentResolver();
		resolver.registerContentObserver(uri, true, new PersonContentObserver(new Handler()));
	}

	private class PersonContentObserver extends ContentObserver
	{
		public PersonContentObserver(Handler handler)
		{
			super(handler);
		}

		// 得到数据的变化通知,该方法只能粗略知道数据的改变,并不能判断是哪个业务操作进行的改变
		@Override
		public void onChange(boolean selfChange)
		{
			// select * from person order by id desc limit 1 // 取得最近插入的值(序号大——>小并取第一个)
			Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person");
			ContentResolver resolver = MainActivity.this.getContentResolver();
			Cursor cursor = resolver.query(uri, null, null, null, "id desc limit 1");
			if(cursor.moveToFirst())
			{
				String name = cursor.getString(cursor.getColumnIndex("name"));
				Log.i("lisenter", name);
			}
		}
	}
}

关于contentProvider的基本使用,请参看本博客博文《Android开发13——内容提供者ContentProvider的基本使用》

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Android开发13——内容提供者ContentProvider的基本使用
  一、ContentProvider简介 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。ContentProvider为存储和获取数据提供了统一的接口。虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如采用文件方式对外共享数据,需要进行文件操作读写数据;采用sharedpreferences
917 0
@ConfigurationProperties注解对数据的自动封装
@ConfigurationProperties注解对数据的自动封装 @ConfigurationProperties可以对基本数据类型实现自动封装,可以封装格式为yyyy/MM/dd的日期 测试代码: package aat; import java.
1472 0
Android开发18——获取网络资源之json数据
一、项目背景在Android开发中有一项非常广泛的应用:Android项目获取另一个web项目的资源或者返回的数据。 本文获取web项目返回的JSON数据。Android应用解析JSON比XML性能要好,但有许多项目仍然采用的是XML。     二、实例代码 Web项目 /** * 新闻业务类 * * @author 徐越 * */ public cl
1067 0
Android开发17——获取网络资源之XML数据
一、项目背景在Android开发中有一项非常广泛的应用:Android项目获取另一个web项目的资源或者返回的数据。 本文获取web项目返回的XML数据。     二、实例代码   Web项目 /** * 新闻业务类 * * @author xy * */ public class VideoNewsServiceImpl implements VideoNew
977 0
Android开发10——Activity的跳转与传值_显示意图(intent)的应用
Activity跳转与传值,主要是通过Intent类,Intent的作用是激活组件和附带数据。 intent可以激活Activity,服务,广播三类组件。 本博文讲的是显示意图激活Activity组件。所谓显示意图就是在activity的激活时,显示指出了需要激活的activity的名字。   一、Activity跳转 方法一 Intent intent = new Inten
1071 0
+关注
515
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载