2012-01-09 126 views
15

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

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

是否为每个表编写DB触发器的唯一方法?

+0

SQLLite数据库操作仅适用于您的应用程序(或)可能来自任何地方? – kosa 2012-01-09 05:17:54

回答

5

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

但是,thinksteep问,你是否期望你的数据库在你自己的应用程序范围之外被改变?

+0

然而,正如thinksteep所问,你是否期望你的DB在你自己的应用程序范围之外被改变?非常有用的通知 – 2012-12-28 15:24:01

+1

CursorAdapter提供了哪些更改通知? – 2014-09-28 06:45:32

+0

CursorAdapter的通知基于Android的东西,这些东西直接与数据库更改无关。程序员在数据库更改时通知该机制。 – 2018-02-21 15:58:24

1

每当你改变一些东西,你可以打电话cursor.registerDataSetObserver(..)注册观察变化,您可以注册一个观察者类如DataSetObserver

然后。

这不是有据可查的,但我敢肯定,有一些例子在那里

+1

据我所知,游标提供了数据的快照。这意味着除非您重新查询数据,否则侦听器将不会被调用。从文档:“*注册一个观察者,当这个游标数据集的内容发生变化时调用,例如,当通过调用(),deactivate()或close()。*更改数据集时, – 2014-09-28 06:19:27

+0

这会在程序员调用内容provider.notifyChange时触发,并且不会自动检测到更改。 – 2018-02-21 16:00:00

0

您可以使用也使用getContentResolver().registerContentObserver但不幸的是它不会告诉你什么样的变化作出,也可以是删除,插入或更新。

如果您控制与数据库接口的ContentProvider,那么您可以触发一个意图或使用getContentResolver().notifyChange发送一个特殊的Uri通知来标识表和动作。你可以通过的一个例子Uri可能是:content://my-authority/change/table-name/insert

但即使这样,你也不知道确切的哪些行受到变化的影响。

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

我很想听听这些是否有更好的解决方案!