android – 没有内容提供者的CursorLoader&SQLite

我知道这个问题已经讨论过了,但是我想问一下这个问题的现状。 我必须创build一个ContentProvider来使用CursorLoader与sqlite数据库连接吗?

我发现

没有ContentProvider的CursorLoader用法

Emmby评论说,看起来正是我所希望的

  • 用户应该意识到一个限制,就是没有任何机制来刷新数据变化(就像装载机应该这样做)

所以提到另一个解决scheme

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

又指出了一些缺点

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

当然,在使用LoaderManager的时候,我们希望得到它所引入的所有好处。 所以我的问题是,如果有一种方法来使用LoaderManager连接到一个SQLite数据库,而不必实现一个内容提供者,但有它的所有好处。

谢谢

您在文章中提到的两个实现都提供了CursorLoader所有优点, 除了在底层内容更改时能够接收通知。

最近我一直在研究这个问题,我可以很自信地告诉你,Android API目前不提供这样做的方法,只有一个原始的SQLiteDatabase (它只提供ContentResolver#notifyChange()Cursor#setNotificationUri()方法,这是用来通知所有Cursor注册下的某个通知Uri )。

也就是说,你现在的select是:

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

  2. 使用Mark Murphy的LoaderEx库,只使用他的库提供的AsyncTask操作进行数据库修改。 请注意,他的任务刷新Loader的原因是因为他们在执行插入/更新/删除操作之后立即在Loader上调用onContentChanged ,有效地告诉Loader内容已经更改,并且应该刷新其数据。

  3. 只要使用带有CursorLoaderContentProvider ,就可以使用ContentResolver#notifyChange()方法通知CursorLoader发生了内容更改。

我试图找出一个更好的解决scheme,如果我find/实现一个解决scheme,我将在未来报告,但现在这些将不得不做。

这是我的解决scheme,在我的onCreateLoader

 { Uri u = Uri.parse("content://what_string_you_want"); return new CursorLoader(this, yourURI, projection, null, null, null) { private final ForceLoadContentObserver mObserver = new ForceLoadContentObserver(); @Override public Cursor loadInBackground() { Cursor c = YOUR_DATABASE.doYourQuery(...); if (c != null) { // Ensure the cursor window is filled c.getCount(); c.registerContentObserver(mObserver); } c.setNotificationUri(getContext().getContentResolver(), getUri()); return c; } }; } 

在将改变数据库的代码后,添加

  getContentResolver().notifyChange( Uri.parse("content://same_with_first_string"), null);