`

android cursor和cursoradapter的监听机制

 
阅读更多

本文部分参考 http://www.cnblogs.com/ufocdy/archive/2011/03/17/1987327.html 

主要是以简单的语言说明cursor和cursorAdapter的监听机制

先来讲讲cursor的监听机制,

给cursor加监听很简单,调用cursor.registerContentOberserver()即可,然后重写onChange()方法,这样数据库变化,就会回调onChange方法

背后的监听机制是什么呢?

cursor是接口,实现应该是在AbstractCursor里面,AbstractCursor有一个ContentObservable继承自Observable,这个就是经典的观察者模式了,

调用这个方法后,会向这里注册一个观察者,来监控数据库

现在有观察者了,那数据库变化,又是怎么通知过来的呢?

还记得自定义provider的时候,有一句必须要加的话不?在add和update和delete的时候--->cur.setNotificationUri(getContext().getContentResolver(), uri);

这里就是通知observer数据库变化的,其实是通知AbstractCursor的setNotificationUri

public void setNotificationUri(ContentResolver cr, Uri notifyUri) {
        synchronized (mSelfObserverLock) {
            mNotifyUri = notifyUri;
            mContentResolver = cr;
            if (mSelfObserver != null) {
                mContentResolver.unregisterContentObserver(mSelfObserver);
            }
            mSelfObserver = new SelfContentObserver(this); 
            mContentResolver.registerContentObserver(mNotifyUri, true, mSelfObserver); 
            mSelfObserverRegistered = true;
        }
    }

然后上面我们不是刚好通过cursor在这个AbstractCursor中加入了观察者么?原来世界如此美好,数据库的变化一切尽在监控之中

再来说说cursorAdapter的监听

cursorAdapter自己内部已经做好了监听,你想在数据库变化后做一些改变,只要重写onContentChanged()即可

那么它是如何监听的呢?

其实他的机制和上面的cursor是一样,在你调用cusoradapeter.changeCursor方法的时候,系统会调用一个 cursorAdapter.registerContentObserver和registerDatasetObserver,同时取消上次注册的监 听

然后呢?然后就没有然后了,你坐等数据库变化就可以了

分享到:
评论

相关推荐

    Android 简单音乐播放器 (涉及 CursorAdapter、ContentResolver、监听器、服务、广播)

    内容概要: ...能学到什么:ContentProvider、ContentResolver、CursorAdapter、Cursor、后台服务、前台服务、绑定服务、自定义广播、播放进度条、OnClickListener监听器 适用人群:Android开发初学者

    CursorAdapter和ListView结合使用

    在Android开发中,ListView是用于显示大量数据列表的常用组件,而CursorAdapter则是与数据库查询结果(Cursor对象)配合使用的适配器。本篇将详细阐述CursorAdapter与ListView结合使用的核心概念、步骤以及最佳实践...

    CursorAdapter

    4. **改变数据的监听**:使用`registerDataSetObserver()`和`unregisterDataSetObserver()`方法,CursorAdapter可以监听到数据集的变化,例如当数据库中的数据发生变化时,Adapter会自动更新视图。 在实际的项目中...

    CursorAdapter Filter

    CursorAdapter Filter是Android开发中的一个重要概念,主要用于在ListView或GridView等视图中过滤和显示数据库查询结果。在Android应用开发中,我们常常需要从SQLite数据库中检索数据,并将其动态地展示给用户。...

    CursorAdapter demo

    通过这个 "CursorAdapter demo",你可以了解到如何在实际项目中有效地展示数据库查询结果,特别是在处理大量数据时,CursorAdapter 的高效和灵活性使其成为 Android 开发中的重要工具。在实践中,你还可以结合 ...

    android 源码 电子词典

    通过findViewById()方法获取布局中的元素,并进行事件监听和数据绑定。 6. 性能优化:考虑到大量单词查询可能导致性能问题,可以使用缓存、分页加载、异步查询等策略来优化。例如,使用HashMap缓存最近查询的结果,...

    SQLite适配器使用

    SQLite是Android系统中内置的关系型数据库,用于存储和管理应用程序中的结构化数据。...了解并熟练掌握SimpleCursorAdapter和CursorAdapter的使用,能极大地提升Android应用的数据展示效率和用户体验。

    android平台联系人管理应用源码+项目(项目直接导入可运行)

    本项目“android平台联系人管理应用源码+项目”提供了一个可以直接运行的实例,对于学习和理解Android联系人管理的实现机制非常有帮助。以下是基于这个项目的一些关键知识点和详细说明: 1. **Android开发环境**:...

    android-simple-listview-app:简单的Android ListView用法(CursorAdapter)示例

    通过学习这个"android-simple-listview-app"示例,开发者可以了解如何使用CursorAdapter和SQLite数据库来创建一个动态更新的ListView,这对于开发包含大量数据的Android应用是非常有用的。同时,这个项目也展示了...

    android GridView数据库开发案例

    在与数据库结合的案例中,我们通常使用CursorAdapter,因为它可以直接与SQLite数据库查询结果(Cursor对象)进行交互。首先,你需要创建一个SQLite数据库,使用SQLiteOpenHelper类的子类,重写`onCreate()`和`...

    android中AutoCompleteTextView使用

    综上所述,`AutoCompleteTextView` 和 `MultiAutoCompleteTextView` 在Android开发中扮演着重要的角色,它们能有效提升用户的输入体验,节省用户的时间。通过熟练掌握这些控件的使用,开发者可以构建出更加友好和...

    android listview和spinner实例代码

    在Android开发中,ListView和Spinner是两种非常常用的UI组件,它们在数据展示和用户交互方面起着关键作用。本文将详细讲解如何在Android应用中实现ListView和Spinner,并结合不同的数据源进行实例操作。 首先,我们...

    Android学习 ContentProvider数据更新与Observer模式.doc

    `CursorAdapter`是用于绑定Cursor(SQLite查询结果)和ListView等视图的Adapter,它会在`ContentObserver`触发更新时重新查询数据并刷新界面,确保UI与数据源始终保持一致。 在实际开发中,开发者需要注意如何正确...

    Android基础 SQLite和ListView

    在Android开发中,SQLite和ListView是两个非常重要的基础组件,它们在构建应用程序时扮演着不可或缺的角色。SQLite是一个轻量级的数据库系统,用于在移动设备上存储和管理数据,而ListView则是显示大量有序数据的...

    android通讯录代码(非原生android)

    Android的Content Provider是不同应用间共享数据的主要机制。对于通讯录,你需要使用`ContactsContract`类来与系统的联系人提供者交互。你可以通过`Uri`对象查询、插入、更新或删除联系人。 3. **数据查询与显示**...

    android Spinner控件实例

    在XML布局文件中,可以使用`<Spinner>`标签来声明Spinner,并通过`android:id`、`android:layout_width`和`android:layout_height`属性来指定其ID、宽度和高度。 ```xml android:id="@+id/my_spinner" android:...

    android开发的简单通讯录管理

    3. 内容提供者:Android的Content Provider机制允许应用之间共享数据。为了实现通讯录管理,我们需要创建一个自定义的Content Provider,它会暴露通讯录数据接口。通过URI,其他应用可以查询、插入、更新或删除联系...

Global site tag (gtag.js) - Google Analytics