AOSP 贡献:Sqlite DB 的 CursorLoader 而不是 ContentProvider

AOSP contribuition: CursorLoader for Sqlite DB instead of ContentProvider

为什么android平台没有SqliteCursorLoader?这与 CursorLoader 类似,但用于 SQLite DB 而不是 Content Provider。网上找了一些实现,好像有用。

Why is there no SqliteCursorLoader in android platform?

因为要履行Loader的契约是非常困难的。 Loader 需要能够做三件事:

  1. 异步完成工作。这可以通过从 AsyncTaskLoader 继承来处理,所以这里没有真正的问题。

  2. 在配置更改期间保留加载的数据。这是框架提供的,所以这里没有真正的问题。

  3. 当内容发生变化时自动传送更新的内容。

项目#3 是问题所在。这与 CursorLoader 一起工作的唯一原因是因为 ContentProvider 系统已经有了 ContentObserver 的概念并且已经期望提供者进行适当的通知调用以让系统了解数据更改。

因此,不仅要实现 SQLiteCursorLoader,还必须确保在修改数据库的任何地方都会引发一个事件(例如,通过 LocalBroadcastManagerLoader 可以监听以便知道它需要重新查询数据库并提供新的 Cursor

现在,出于项目的内部目的,您可能愿意跳过合同并跳过第 3 项。这太酷了。但是,由于该限制,我不建议分发这样的实现(例如,作为开源项目)。这就是我停止 SQLiteCursorLoader 的原因(除了普遍认为 Loader 框架是失败的抽象之外)。