【问题标题】:Android SQLite DB notificationsAndroid SQLite DB 通知
【发布时间】:2012-01-09 04:33:55
【问题描述】:

我正在编写一个 Android 应用程序,只要给定 SQLite 数据库发生更改(添加、删除或更新任何新行),就需要通知该应用程序。

是否有任何程序化方式来收听这些通知?

为每个表编写数据库触发器是唯一的方法吗?

【问题讨论】:

  • SQLLite 数据库操作只能来自您的应用程序(或)可以来自任何地方?

标签: android sqlite android-notifications


【解决方案1】:

SQLite 提供Data Change Notification Callbacks。我不认为 Android 会直接公开它们,但它确实有例如CursorAdapter,它提供了一些更改通知。

然而,正如 thinksteep 所问的那样,您是否希望在您自己的应用程序范围之外更改您的数据库?

【讨论】:

  • 然而,正如 thinksteep 所问的那样,您是否希望在您自己的应用程序范围之外更改您的数据库?非常有用的通知
  • CursorAdapter 提供哪些变更通知?
  • CursorAdapter 的通知基于与数据库更改直接无关的 Android 内容。当数据库发生变化时,由程序员通知该机制。
【解决方案2】:

你可以注册一个观察者类比如DataSetObserver

然后,每当您更改某些内容时,您都可以调用cursor.registerDataSetObserver(..) 来注册观察更改。

没有很好的记录,但我确信那里有一些例子

【讨论】:

  • 据我了解,光标提供了数据的快照。这意味着除非您重新查询数据,否则不会调用侦听器。来自文档:“注册一个观察者,当 this 游标数据集的内容发生更改时调用,例如,当数据集通过 requery()、deactivate() 或 close() 更改时。 "
  • 这会在程序员调用 content provider.notifyChange 时触发,并且不会自动检测更改。
【解决方案3】:

您也可以使用getContentResolver().registerContentObserver,但遗憾的是它不会告诉您进行了何种更改,可能是删除、插入或更新。

如果您控制与 DB 接口的 ContentProvider,那么您可以触发 Intent 或使用 getContentResolver().notifyChange 发送一个特殊的 Uri 通知,以标识表和操作。您可以通知的一个示例 Uri 可能是:content://my-authority/change/table-name/insert

但即便如此,您也不确切知道更改影响了哪些行。

似乎写入更改日志表的触发器将保证您听到所有更改,无论它们来自何处,并且您可以知道发生的确切 ID 和操作。不幸的是,这意味着插入/更新/删除速度较慢,这意味着您可能需要某种服务来处理和删除更改。

我很想知道这些是否是更好的解决方案!

【讨论】:

    猜你喜欢
    • 2017-04-03
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 2013-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多