下午好。
我只是不明白如何在 android 中订阅数据库更新(SQLiteDatabase)?
目前有几个问题:
- 来自另一个进程的更改(如果它已更改,并且我们使用通常的观察者模式,那么在我们的进程中将不会发生更新。
- 从另一个类实例更改。问题与上一段相同。
我尝试使用 FileObserver (订阅数据库文件 MODIFY 事件),但它有问题:
- 事实上,它会通知数据库中的每一次更改。也就是说,要么你需要在它上面挂上某种去抖动,要么已经在订阅者中管理它。
- 单个更改(尤其是插入)可以触发多个 MODIFY 事件。
- 该事件发生在对象中的数据库同步之前。也就是说,如果我们通知,数据库实例中的数据可能不会更新(竞争条件)。
我尝试使用一堆FileObserver -> обновление бд объектов -> рассылка подписчикам
,但由于某种原因,数据库中的数据仍然不是最新的。
请不要建议使用 ContentProvider,因为据了解,更改不仅可以在 UI 中接收。
所以问题是:有没有办法跟踪数据库更新?
Android 中的 SQLite 化身不支持用于数据库更改的侦听器机制。但是,我看到了 3 种方式:
1)英雄的路径:通过Android NDK修改监听器钩子挂起
2)通过ORM完美完成:拿一些ORM,例如我最喜欢的ORMLite或GreenDAO,挂起修改监听器不再是数据库修改,而是SQLite之上的对象修改
3)最正确的:,但由于某种原因不被你爱 - 通过
ContentProvider
。写入所有对 SQLite 的访问ContentProvider
并挂断ContentObserver
:如果您认为它
ContentObserver
只会听取通过 UI 进行的修改-我赶紧让您失望-您错了