可以避免为内部使用的数据库实现 ContentProvider 的开销吗?

Can the overhead of implementing ContentProvider for an internally used Database be avoided?

Android developer guide 状态:

You don't need to develop your own provider if you don't intend to share your data with other applications.

所以据了解,如果我有一个完全在应用程序本地使用的 SQLite 数据库,则不需要 ContentProvider(避免编写大量样板代码),但我没有得到什么 "Android" 如何在后台查询此数据库? (尽可能减少重新发明轮子的开销)

看来这个任务就是Loaders are for, as sateted in the docs:

loaders make it easy to asynchronously load data in an activity or fragment.

但是 Loader 没有子类可以执行此任务,最近的子类 - CursorLoader 被设计为与 ContentResolver 耦合。那么,我错过了什么吗?是否有 Loader 的第三方实现可以做到这一点,或者是否有其他方法?

谢谢!

A Loader 是一种挂钩到 Activity 生命周期的机制,可用于异步加载任何类型的数据,无论是 ContentProvider、网络,还是您只需要处理一堆数据数字。

在基础上有一个名为 AsyncTaskLoader 的加载程序,CursorLoader 实际上是从中继承的。这可用于提供加载程序的基本级别功能。您所要做的就是实施一个 需要加载的数据模型,然后实现AsyncTaskLoader#loadInBackground()方法获取。在这种情况下,您将查询数据库,然后以您选择的形式 return 结果。也许在这种情况下你不想 return a Cursor 但你想创建 Pojo 来代表 Cursor 中的一行。

作为快速实施,您可以使用 CursorLoader's source code 并让它从您的数据库中查询,而不是使用 ContentResolver.

whats the "Android" way to query this DB on the background?

随心所欲。使用 AsyncTask。使用普通的 Thread。使用 IntentService。查看您喜欢的 ORM 是否具有异步选项,或挂钩到 RxJava/RxAndroid 或其他内容。

IOW,没有单一的"Android"方式。

It may seem that this task is what Loaders are for, as sateted in the docs :

A Loader 仅在您希望 UI 层相当直接地使用数据库的情况下相关。您只能将 LoaderActivityFragment.

一起使用

am i missing something?

欢迎您创建自己的 AsyncTaskLoader 子类,它可以直接与 SQLite 一起使用,或许可以使用 CursorLoader 的源代码作为灵感来源。

Is there a third party implementation of Loader that does that

我曾经有过一个。然而,I discontinued it.

如果不需要,则不需要 ContentProvider

  • 与其他进程(应用程序)共享数据;

  • 构建应用程序小部件;

  • 将您自己的搜索建议与 Android 快速搜索框相结合;

...而且您不希望通过自动 UI 更新来花哨地同步和查询数据。

实际上,您可以尝试将 read/write 数据库操作包装在 AsyncTaskLoader 中(尊重 activity 生命周期的 AsyncTask)。此外,您还必须实施自己的观察者来更新视图(使用 data binding 的另一种选择)。