我知道这件事已经讨论过了,但我想问一下事情的现状。我必须创建一个ContentProvider才能将CursorLoader与sqlite数据库结合使用吗?
我发现
CursorLoader usage without ContentProvider
正如Emmby评论的那样,看起来正是我所希望的
的机制(正如加载器应该做的那样
所以这里提到了另一种解决方案
https://github.com/commonsguy/cwac-loaderex
但还是指出了一些缺点。
当然,在使用LoaderManager时,我们希望获得它引入时的所有好处。所以我的问题是,是否有一种方法可以在不实现内容提供者的情况下将LoaderManager与sqlite数据库结合使用,同时又能享受到它的所有好处。
谢谢
发布于 2012-10-13 10:58:57
你在文章中提到的两个实现都提供了CursorLoader
的所有好处,除了当底层内容发生变化时接收通知的能力。
我最近研究了很多,我可以自信地告诉你,Android API目前没有提供一种只使用原始SQLiteDatabase
来实现这一点的方法(它只提供了ContentResolver#notifyChange()
和Cursor#setNotificationUri()
方法,这两个方法用于通知所有在某个通知Uri
下注册的Cursor
)。
也就是说,你现在的选择是:
SQLiteDatabase
的通知,并且能够以某种方式将这些通知转发给应用程序中的所有现有Loader
。我写了一个相当广泛的关于如何实现Loader
的,如果你想接受这个挑战,它可能会派上用场。或者...LoaderEx
库,并且只使用他的库提供的AsyncTask
操作进行数据库修改。请注意,他的任务刷新Loader
的原因是,它们在执行插入/更新/删除操作后立即调用Loader
上的onContentChanged
,有效地告诉Loader
内容已更改,应该刷新其数据。CursorLoader
的ContentProvider
,您可以使用ContentResolver#notifyChange()
方法通知<代码>D27发生了内容更改。<代码>H228<代码>G229我正在尝试找出一个更好的解决方案,如果我找到/实现了一个解决方案,我会在未来向您报告,但目前这些解决方案已经足够了。
发布于 2014-12-10 01:25:16
这是我的解决方案,在我的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;
}
};
}
在将更改DB的代码之后,添加
getContentResolver().notifyChange(
Uri.parse("content://same_with_first_string"), null);
发布于 2021-08-25 15:59:15
将共享首选项中的布尔值设置为false会怎么样?当布尔值为真时更新内容...当任何改变底层数据库的操作..该布尔值将被设置为true,并且作为共享首选项,您可以在调用相关方法后直接接收实时更改
https://stackoverflow.com/questions/12869373
复制相似问题