android - 没有Content Provider的CursorLoader和SQLite

dor*_*uck 54 sqlite android android-contentprovider android-loadermanager

我知道这已经讨论过但我想问一下目前的情况.我是否必须创建一个ContentProvider以将CursorLoader与sqlite数据库结合使用?

我发现

没有ContentProvider的CursorLoader用法

正如Emmby评论的那样,看起来正是我所希望的

  • 用户应该意识到一个限制,即它没有机制来刷新数据更改(因为Loaders应该这样做)

因此提到了另一种解决方案

https://github.com/commonsguy/cwac-loaderex

还指出了一些缺点

  • 但是,要使用自动重新查询,您需要为UI和更新使用相同的加载程序,从而限制其对后台服务的可用性.

当然,在使用LoaderManager时,我们希望获得它所引入的所有好处.所以我的问题是,如果有一种方法可以使用LoaderManager连接sqlite数据库,而无需实现内容提供程序,但具有它的所有好处.

谢谢

Ale*_*ood 66

您在帖子中提到的两个实现都提供了CursorLoader 基础内容更改后接收通知的能力之外的所有好处.

我最近一直在研究这个问题,我可以自信地告诉你,Android API目前还没有提供只使用raw的方法SQLiteDatabase(它只提供ContentResolver#notifyChange()Cursor#setNotificationUri()方法,用于通知所有Cursor注册的某个通知Uri).

那就是说,你现在的选择是:

  1. 自己实现一个能够从SQLiteDatabase内容更改时接收通知的观察者,并以某种方式将这些通知转发给Loader应用程序中的所有现有s.我写了一篇非常广泛的博客文章,介绍如何实现Loader可能会派上用场的s,如果你想接受这个挑战的话.要么...

  2. 使用Mark Murphy的LoaderEx库,只使用AsyncTask他的库提供的操作进行数据库修改.需要注意的是,为什么他的任务刷新的原因Loader是因为他们所谓onContentChangedLoader插入/更新后立刻/执行,有效地告诉删除Loader的内容发生了变化,它应该刷新其数据.

  3. 只需使用a ContentProviderwith a CursorLoader,您就可以使用该ContentResolver#notifyChange()方法通知CursorLoader已发生内容更改.

我正试图找出一个更好的解决方案,如果我找到/实现一个,我将在未来报告,但现在这些必须要做.

  • @AlexLockwood,是否意味着以异步方式加载数据并获取我们需要的数据更改通知(建议使用方法?)来首先实现ContentProvider?我认为ContentProviders的目的是与其他应用程序共享数据,就像它们的描述一样,但看起来它不是唯一的目的. (7认同)