我们在ContentProvider的insert,update,delete等改变之后调用getContext().getContentResolver().notifyChange(uri, null);这样就通知那些监测databases变化的observer了,而你的observer可以在一个service里面注册。

以Downloadmanger为例子:
定义ContentObserver,并且在onChange里做你想做的事情。

以launcher app为例说明,此功能的核心是ContentResolver 的 和 接口。

Launcher.java的一个方法(在onCreate方法里调用),这里即是为要监视的对象注册Observer。我这里讨论如何监视数据库里数据的变化,所以要监视的对象自然是数据库了, LauncherSettings.Favorites.CONTENT_URI 指向的就是一张数据库表(详见launcher app源码)。
private void registerContentObservers() {
ContentResolver resolver = getContentResolver();
resolver.registerContentObserver(LauncherProvider.CONTENT_APPWIDGET_RESET_URI, true,
mWidgetObserver);
resolver.registerContentObserver(LauncherSettings.Favorites.CONTENT_URI, true,                   mObserver);
}

其中mObserver是个 FavoritesChangeObserver 类型的对象(只以它为例讲解),FavoritesChangeObserver类的定义如下:
private class FavoritesChangeObserver extends ContentObserver {
public FavoritesChangeObserver() {
super(new Handler());
}
@Override
public void onChange(boolean selfChange) {
onFavoritesChanged();
}
}

onFavoritesChanged()方法是Observer定义的一部分,用于在接收到通知后进行相应的处理操作。这个方法里的内容不展开叙述,它的工作就是刷新Home界面。
private void onFavoritesChanged() {
mDesktopLocked = true;
mModel.loadUserItems(false, this, false, false);
}

LauncherProvider.java
这里是实际操作数据库的地方,操作完成之后会视情况通知前面注册的Observer。
private void sendNotify(Uri uri) {
String notify = uri.getQueryParameter(PARAMETER_NOTIFY);
if (notify == null || "true".equals(notify)) {
getContext().getContentResolver().notifyChange(uri, null);
}
}

@Override
public Uri insert(Uri uri, ContentValues initialValues) {
SqlArguments args = new SqlArguments(uri);

SQLiteDatabase db = mOpenHelper.getWritableDatabase();
final long rowId = db.insert(args.table, null, initialValues);
if (rowId <= 0) return null;

uri = ContentUris.withAppendedId(uri, rowId);
sendNotify(uri);

return uri;
}

我们在ContentProvider的insert,update,delete等改变之后调用getContext().getContentResolver().notifyChange(uri, null);这样就通知那些监测databases变化的observer了,而你的observer可以在一个service里面注册。

以Downloadmanger为例子:
定义ContentObserver,并且在onChange里做你想做的事情。

  1. /**
  2. * Receives notifications when the data in the content provider changes
  3. */
  4. private class DownloadManagerContentObserver extends ContentObserver {
  5. public DownloadManagerContentObserver() {
  6. super(new Handler());
  7. }
  8. /**
  9. * Receives notification when the data in the observed content
  10. * provider changes.
  11. */
  12. public void onChange(final boolean selfChange) {
  13. if (Constants.LOGVV) {
  14. Log.v(Constants.TAG, "Service ContentObserver received notification");
  15. }
  16. updateFromProvider();
  17. }
  18. }

在DownloadService的onCreate中注册:

  1. /**
  2. * Cleans up when the service is destroyed
  3. */
  4. public void onDestroy() {
  5. getContentResolver().unregisterContentObserver(mObserver);
  6. if (Constants.LOGVV) {
  7. Log.v(Constants.TAG, "Service onDestroy");
  8. }
  9. super.onDestroy();
  10. }

Android里监视数据库的变化相关推荐

  1. Android 5.0 API 的变化——开发人员注意

    Android 5.0 API变化 译自 http://developer.android.com/intl/zh-cn/about/versions/android-5.0.html -- By N ...

  2. Android整合SQLite数据库进行基本的增删改查

    简言 使用Android整合SQLite数据库进行数据存储,大致可以划分为三步: ①继承 SQLiteOpenHelper,创建数据库 ②继承 ContentProvider 类,重写方法 ③在清单文 ...

  3. android中的数据库操作(SQLite)

    android中的数据库操作 android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作. 一.android内的数据库的基础知识介绍 1.用了什么数据库   an ...

  4. android 监听手机电量变化

    今天,简单讲讲如何监听手机电量的变化. 监听电量是不能静态注册的. 后来上网搜索,发现有五个不能静态注册的广播,这里记录一下,免得下次再后知后觉的发现并惊讶于自己的笨拙. 不能静态注册的广播: and ...

  5. 【转】Android开发之数据库SQL

    android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作. 一.android内的数据库的基础知识介绍 1.用了什么数据库 android中采用的数据库是SQLi ...

  6. Android 里的数据储存

    数据持久化 关于数据储存,这个话题已经被反复讨论过很多次了,我是不建议把网络存储这种方式纳入到数据储存的范围的,因为这个和Android没多少关系,因此就有如下的分类: 本地储存(也称之为数据持久化, ...

  7. Android 5.0有哪些变化

    Android 5.0 Changes 译自 http://developer.android.com/intl/zh-cn/about/versions/android-5.0-changes.ht ...

  8. android5.0+art模式,Android 5.0有哪些变化

    Android 5.0 Changes 前排渣翻译预警,如果你能提供更好更专业的翻译或者提出修改意见就好了-- 另外本篇只对Android 5.0特性作了说明,至于对应的API方面的变化,参考下一篇: ...

  9. Android短信数据库简析

    如果想跳过数据库介绍,直接看数据库操作代码的话,请点击这里: 读取Android短信 -------------– Android短信数据库: 读取Android系统所有短信 读取Android短信会 ...

最新文章

  1. 使用ThinkPHP过程中发现的一些坑
  2. 2017 3月16日,上午
  3. C语言从文件中读入矩阵,并且将矩阵转置
  4. 学习3D游戏开发进阶之路
  5. 一个迷你ASP.NET Core框架的实现(下)
  6. weakreference_Java中WeakReference,SoftReference,PhantomReference和Strong Reference之间的区别...
  7. golang中的栈(LeetCode刷题)
  8. apk反编译 Android apktool下载 dex2jar下载 jd-gui下载
  9. 手机同步专家--基于SyncML协议同步通讯录的应用软件
  10. iOS http文件下载
  11. Windows安装pip方法
  12. 深股通,沪股通,港股通
  13. 迷宫小游戏c语言代码,C语言编写的迷宫小游戏-源代码
  14. java计算机毕业设计计算机专业招聘网站MyBatis+系统+LW文档+源码+调试部署
  15. 长时间戴耳机对耳朵的伤害多大?这几点一定要牢记
  16. 计算机cmos参数的设置,CMOS常见的设置方法
  17. leecode-C语言实现-7. 整数反转
  18. 解析计算机科学与技术论文引言,计算机科学与技术专业毕业论文写作指导
  19. ADS(Advanced Design system)创建Symbol并放置
  20. 基于python-tkinter的答题系统

热门文章

  1. Redis学习笔记之Redis单机,伪集群,Sentinel主从复制的安装和配置
  2. 51nod百度之星2016练习赛
  3. WCF HelpPage 和自动根据头返回JSON XML
  4. 周期获取Linux系统内存
  5. 低碳生活:充电电池及充电器
  6. notepad++的NppFTP插件远程连接linux操作系统
  7. 生存分析与R--转载
  8. Nginx基础知识之————日志管理
  9. emacs 新手笔记(四) —— 使用 dired 完成一些简单的文件和目录操作
  10. java.lang.ExceptionInInitializerError