SQLite 的 ContentObserver?

2024-01-22

我一直在研究如何在 ListView 中显示数据库中的数据,同时跟踪数据库中的更改。

假设我有一个聊天应用程序,它显示我所属的所有聊天室的列表视图。

适配器的查询是SELECT * FROM CHAT_ROOM ORDER BY UPTDATE_TIME,这意味着我希望首先显示最近活动的聊天室。正如我在ChatroomListActivity收到一条关于 3 号聊天室的消息,这意味着它现在需要成为 1 号聊天室并相应地重新排列单元格。

我知道加载器能够在后台重新查询,但正如 Commonsware 在我的回答中所回答的那样上一个问题在这里 https://stackoverflow.com/a/13473279/1056359,看来 Loaders 对此还不够好。

是否有不同的机制来实时观察数据库变化?


我这样做的方式

  • 类 GroupChatActivity
  • 类消息数据源
  • 类 HandleNewMessage

群聊活动有点明显。 MessageDataSource 是从数据库插入和返回对象的类。 HandleNewMessage,这个我想不需要解释了。

  • GroupChat -> MessageDataSource -> getMessages()
  • HandleNewMessage -> MessageDataSource -> insertNewMessage();

您现在想要的是 GroupChat 和 HandleNewMessage 与 MessageDataSource 的同一实例进行对话。 所以你要做的就是在 MessageDataSource 中对 MessageDataSource 进行静态引用 例子:

 public class MessageDataSource {

    private static MessageDataSource mInstance;

    public static MessageDataSource getInstance(Context context) {
        if(mInstance == null){
            mInstance = new MessageDataSource(context);
        }
        return mInstance;
    }

    private MessageDataSource(Context context) {
        // NOTE: private constructor
    }
}

因为你将构造函数设为私有,所以你不能这样做

MessageDataSource data = new MessageDataSource(context);

因为构造函数是私有的,所以你必须这样做

MessageDataSource data = MessageDataSource.getInstance(context);

现在你的课程团体活动 and 处理新消息可以与您的 MessageDataSource 的同一实例对话,您可以进行自定义界面通知任何正在观察的听众。

Example:

    public class MessageDataSource {

    private static MessageDataSource mInstance;

    private SQLiteDatabase mDataBase;
    private SQLiteHelper DBHelper;
    private OnInsert mOnInsert;

    public static MessageDataSource getInstance(Context context) {
        if(mInstance == null){
            mInstance = new MessageDataSource(context);
        }
        return mInstance;
    }

    private MessageDataSource(Context context) {
        DBHelper = SQLiteHelper.getInstance(context);
    }

    public void createMessage(String JID, String message, String sender) {
        // Do DB Stuff here
        if(mOnInsert != null) {
            mOnInsert.onInsert(message);
        }
    }


    public void setOnInsertListener(final OnInsert onInsert) {
        mOnInsert = onInsert;
    }

    public static interface OnInsert {
        // Notify the observer that an insert has bin made
        public String onInsert(String message);
    }
}

您可以通过您认为需要的接口发送任意数量的对象。 现在在你的群聊活动您可以按照设置 OnClickListener 的常规方式设置(在我的情况下)OnInserListener。或者你可以让你的活动实现接口。

这个示例可能不符合您的确切需求,但是为了观察何时将新内容插入到您的数据库中并且您需要更新您的 listView,我认为这是正确的方法,但如果有人找到更好的方法,请发表评论。 :D

我希望这能让你朝着正确的方向前进。

亲切的问候。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQLite 的 ContentObserver? 的相关文章

  • PhoneGap/Cordova 应用程序通知

    我是 PhoneGap Cordova 的新手 我希望向我的应用程序添加一些通知 推送通知 因此当应用程序上发布新文章时 它会提醒用户 本地通知 在设定的时间间隔 日期和时间 我可以提示用户我的应用程序上的最新文章 我进行了大量搜索 但找不
  • Android主线程的IO操作

    我的问题有两个 是否建议在 Android 的主线程上进行 IO 操作 或者它是否有可能导致我的应用程序崩溃 如果在主线程上执行 IO 操作不理想 我可以使用哪些其他框架 以便当我的应用程序加载时它可以执行一些基本的 IO 文件读取并将值存
  • 如何在 Android 中更改 Drawable 的颜色?

    我正在开发一个 Android 应用程序 并且我有一个从源图像加载的可绘制对象 在此图像上 我想将所有白色像素转换为不同的颜色 例如蓝色 然后缓存生成的 Drawable 对象 以便稍后使用它 举例来说 假设我有一个 20x20 PNG 文
  • Android 中的 Fragment-Fragment 通信

    我在Android编程方面处于初级水平 所以我需要你真诚的帮助 请任何人帮助我 我正在尝试使用片段构建滑动用户界面 所以我真正的疑问是 我有一个Fragment say FragmentA 它有一个TextView and Button在其
  • 如何通过我的活动在 Android 中设置铃声?

    我正在尝试找到一种方法来通过 Android 活动中的代码设置新的默认铃声 我已经将铃声下载到bytearray 最后 我设法将默认铃声设置为我下载的铃声 下面不包含下载代码 仅包含将其设置为默认铃声所需的代码 File k new Fil
  • 吉夫伦致命信号11

    我正在尝试使用一些本机代码来创建 Gif 我使用绘画绘制图像 创建一些笔画 单击 保存 绘制的图像将保存为 JPG 格式 当我单击 创建 Gif 时 它会获取所有图像并开始创建 gif 这是当我收到致命信号 11 并且应用程序重新启动时 我
  • Fragment 问题中的 ExpandableListView

    我正在尝试在片段中实现可扩展列表视图 没有错误出现 当我尝试记录两个的输出时List
  • 如果使用grifika的ContinualCaptureActivity中的预览方式,相机预览的视野会更小

    我们知道 当相机预览比例设置为时 在相同距离下我们会得到更大的预览视野4 3代替16 9 具体如下 Android Camera API 奇怪的缩放效果 https stackoverflow com questions 20664628
  • ADB TCPIP 连接问题

    我有两台 Galaxy S3 其中一个已扎根 另一个则未扎根 因此 当我尝试通过本地网络连接它们时 计算机可以看到已root的计算机 但是正常的就卡在tcpip这一步了 所以 我写 adb tcpip 5555 It says restar
  • 控制 OverlayItem 大小

    我正在构建一个在单个 ItemizedOverlay 中包含几十个 OverlayItems 的地图 我的地图设计为可以非常近距离地查看 大约缩放级别 18 并且 OverlayItems 彼此非常接近 地图放大时看起来不错 但是 如果用户
  • 如何为我的 Android Market APK 创建证书?

    我想将我的第一个 APK 应用程序上传到 Android Market 但我收到了此错误 顺便说一下 在 stackoverflow 中搜索时并没有引导我找到正确的链接 市场不接受使用调试证书签名的 APK 创建有效期至少 50 年的新证书
  • 在运行时更改用作背景的 Drawable xml 内的形状纯色

    我有一个 Drawable xml 文件 background xml
  • 移动设备上的 TensorFlow(Android、iOS、Windows Phone)

    我目前正在寻找不同的深度学习框架 特别是用于训练和部署卷积神经网络 要求是 它可以在带有 GPU 的普通 PC 上进行训练 但训练后的模型必须部署在三个主要的移动操作系统上 即 Android iOS 和 Windows Phone Ten
  • 安卓。 CalendarView...一次仅显示一个月的日历

    我正在使用 CalendarView 其中我想一次仅查看一个月的日历并滚动查看下个月 但 CalendarView 一次显示所有月份 下面是我的代码
  • Android SearchView 在启动时隐藏键盘

    我有一个小问题正在尝试解决 当我打开应用程序时 键盘会显示输入搜索视图的查询 不过 我只想在单击搜索视图时显示键盘 我该如何解决 Thanks 这对我有用 用于隐藏焦点的代码 searchView SearchView view findV
  • 离子初始加载时间

    我正在使用 Ionic 构建一个简单的应用程序 但我的应用程序在冷启动时的初始加载时间方面存在性能问题 这是我所做的 collection repeat 代替带有 track by 的 ng repeat 原生滚动 overflow scr
  • Android 标记如何实现拖放?

    你好 我正在 Android 中开发 MapView 应用程序 我有三个标记 我希望稍后能够使用 Google Map API getlocation function 为了尝试一下 我想使用拖放功能移动标记 然后检查位置 任何人都可以通过
  • 如何更改操作栏背景和文本颜色

    我正在使用本教程中的导航抽屉 http www androidhive info 2013 11 android sliding menu using navigation drawer http www androidhive info
  • Android-dispatchTouchEvent 给了我一个 StackOverflowError

    这里我有一个带有 setOnTouchListener 的 ViewFlipper 它工作得很好 然后我膨胀 ReLayNewsItem 然后将其添加到 ViewFlipper 现在我希望 WebView web 监听触摸事件并将它们传递给
  • Android GetPTLAFormat 上的 Phonegap 错误

    我们正在开发一个使用 jQuery 移动和电话间隙的应用程序 一切似乎都工作正常 但是当在连接的 Android 手机上运行应用程序时 我们在 Eclipse logcat 中看到大量类似这样的错误 0 GetPTLAFormat inva

随机推荐

  • 在 Go 中设置 SQL 连接的 TCP 超时

    当我使用 VPN 连接到数据库 使用标准 go sql 库 并且 VPN 接口关闭时 当我尝试执行 SQL 查询时 无论接口是否同时打开 都会出现 75 秒超时 我想将此超时减少到某个合理的时间 这样在这种情况下我的应用程序就不会被冻结 7
  • MPI 中对 cout 的“原子”调用

    我感兴趣的是 OpenMPI 中是否有命令或技术可以进行原子调用来写入 stdout 或者就此而言 任何流 我注意到 在 MPI 程序执行期间 写入 cout 或其他流 的调用可能会变得混乱 因为每个过程可能会在到达代码的某个部分时进行写入
  • 同步 XML 架构验证? .NET 3.5

    我知道我可以使用如下回调方法根据模式验证 xml 但是有没有一种方法可以同步执行而不是事件驱动 我想到的一种方法是设置一个类成员布尔标志 IsValidated false 然后调用 xml Validate ValidationEvent
  • Firebase 用户 UID 与身份验证 UID 不匹配

    我是 Firebase 的新手 我正在使用react redux firebase 但不确定这是否与这个问题相关 我在使用这些标准身份验证规则时遇到问题 rules users uid read uid auth uid write uid
  • 导入游戏.request

    我在用着Android Studio并尝试将 Google Play 游戏服务导入我的应用程序 已导入库中的 BaseGameUtils 文件夹 现在 GameHelper 类中的以下行出现错误 import com google andr
  • HornetQ 核心 API 和 JMS

    我有几个关于 HornetQ 的问题 HornetQ 核心 API 和 JMS API 之间有什么区别 使用其中之一有什么优点或缺点吗 如果我使用核心 API 然后我决定这样做 这是真的吗 更改我的消息传递总线 比如说 ActiveMQ 然
  • 使用字典中的键反转多个值

    我对 Python 和整体编程还很陌生 所以请耐心等待 我有一本字典 Male Female Eunuch 作为值和这些作为键的不同名称 Persons Hodor Male Tyrion Male Theon Male Arya Fema
  • 更改实时 MySQL 数据库上的字符集

    我目前在 MySQL 5 1 x 数据库中有一堆使用 latin1 字符集的表 问题是 我们最近有一群用户尝试使用 UTF 8 编码输入文本 这似乎破坏了一切 盲目更新表的字符集是否安全 对于这种情况 有哪些最佳实践 除了显然备份所有内容之
  • 使用 local.xml 从顶部菜单中删除链接

    有谁知道如何使用 local xml 从顶部菜单中删除链接 默认的 checkout xml 中有
  • 为什么Rails Active Record迁移在mysql的varchar列上生成COLLATE utf8_bin

    我在 Rails 版本 3 0 10 上运行 jruby 我发现活动记录迁移以某种方式在所有 varchar 列上生成 COLLATE utf8 bin 当我表演创建表用户时 CREATE TABLE users id int 11 not
  • ElasticSearch 聚合:每个聚合排除一个过滤器

    我想过滤掉字段 A 等于 a 的文档 并且我想同时对字段 A 进行分面 当然不包括之前的过滤器 我知道您可以将过滤器放在查询 外部 以便在不应用该过滤器的情况下获取方面 例如 弹性搜索 query match all filter term
  • Android如何从Geocoder返回的地址获取街道名称

    我在用着Geocoder以相反的方式从给定的纬度和经度获取地址 你知道如何从Address 只有街道名称 Geocoder geocoder new Geocoder AutoFinderMapActivity this try List
  • SwiftUI 更新导航栏标题颜色

    如何在 SwiftUI 中更改导航栏标题颜色 NavigationView List ForEach 0 lt 15 item in HStack Text Apple font headline fontWeight medium col
  • PHP 对象属性的动态名称

    而不是使用 object gt my property 我想做这样的事情 object gt my variable 像这样使用大括号 object gt my variable
  • 从 CLI 同时执行多个 php 脚本

    我有 55 个 php 文件 我想从命令行同时运行它们 现在 我使用以下代码在多个 CLI 窗口中运行它们 php Script1 php 我希望能够调用一个 php 文件来同时执行所有 55 个 php 文件 我一直在阅读有关如何使命令行
  • 如何计算谷歌电子表格中逗号分隔数字的数量?

    我有一个有值的单元格 1 2 3 4 我需要一个在另一个单元格中返回 4 的公式 但是这个 Google 电子表格看起来非常复杂 我还需要修剪 因为数字之间可能有空格 一种选择是使用以下公式 COUNT SPLIT A1 这是一个例子
  • 为什么在测试 PSCustomObject 的属性时操作数的顺序很重要

    两种情况我都尝试过 psCustomObject x eq null and null eq psCustomObject x在 if 语句中 只有后者通过了 if 为什么会这样 这似乎不合逻辑 我的具体用例是一个包含多个环境配置的 jso
  • 这个哈夫曼表是如何创建的?

    我有一张表显示事件发生的概率 我对第 1 部分很满意 但第 2 部分我不太喜欢 我正在努力弄清楚如何 二进制数是在第 2 部分中导出的 我知道 0 被分配给最大的概率 我们从那里开始工作 但是我们如何计算出下一组二进制数是什么 数字周围的圆
  • 无法通过反应中动态 div 元素的索引号从数组中删除特定元素?

    我无法从任何动态 div 中按索引号删除数组的特定元素 const useState React function Check var Children setChildren useState function RemArr docs c
  • SQLite 的 ContentObserver?

    我一直在研究如何在 ListView 中显示数据库中的数据 同时跟踪数据库中的更改 假设我有一个聊天应用程序 它显示我所属的所有聊天室的列表视图 适配器的查询是SELECT FROM CHAT ROOM ORDER BY UPTDATE T