指向内容提供者中的加入查询的游标加载器未更新列表
Posted
技术标签:
【中文标题】指向内容提供者中的加入查询的游标加载器未更新列表【英文标题】:Cursor loader pointing to join query in content provider not updating list 【发布时间】:2015-02-02 16:42:01 【问题描述】:我在内容提供程序中设置了多个指向不同 URI 的光标加载器,它们可以正常工作。每个加载器都针对我数据库中的特定表。
但是,我现在在内容提供程序中创建了一个新 URI,以在我的表上执行连接查询。我创建了一个新的加载器,它指向用于执行连接查询的 URI,但加载器不会更新 UI。
如果我关闭应用程序然后打开它,则会出现新数据,但在一个活动中插入新数据然后返回到我的主要活动后,数据尚未更新。尽管数据库中插入了新数据,但加载程序没有被调用。
我正在调用 cursor.setNotificationUri(getContext().getContentResolver(), uri);用于我的新加入 URI。
这不起作用有什么特别的原因吗?就像我说的,加载器可以很好地用于单个表的标准查询,但带有连接查询的加载器不能。
加载器只能监听一个正在更新的表,为什么它不能监听联接?
编辑:
有关工作流程的更多信息...
Activity 1 使用单独表的连接查询读取数据并显示到 UI 活动 2 将数据插入到数据库的单独表中
Activity 1 启动 Activity 2,在插入数据后结束
Activity 1 有一个加载器来更新 UI。从单个表读取的加载器工作正常,但在更新数据时不会调用从连接查询读取的加载器。仅在创建 Activity 时调用。
【问题讨论】:
您是使用联接还是单独的 Uris 插入新数据?我认为如果您插入到A
或B
,那么只有A
或B
的光标会被刷新,但是如果您有A join B
的光标,那么插入A
不会刷新这些光标.例如,它如何知道哪些其他 Uris 依赖于 A
?请注意,我还没有进入ContentProvider
s!希望你能找到答案,我也很好奇。同时你可以试试onResume
:getLoaderManager().getLoader(id).onContentChanged();
数据分别插入到表中,然后在连接中读回。您所说的可能是问题的原因。
@TWiStErRob 你建议使用onResume: getLoaderManager().getLoader(id).onContentChanged();
是一个好习惯吗?它有效,但我想知道它是否是最佳选择。
直到我们无法回答“它如何知道哪些其他 Uris 依赖于 A?”,这是始终显示最新数据的最佳选择。我使用的是 DB 游标而不是 ContentProvider 游标,所以我必须调用它。我由!getLoaderManager().hasRunningLoaders()
守护它。
我会尝试使用视图(将 dp 保存在数据库中。
【参考方案1】:
我知道很久以前有人问过这个问题,但希望它可以帮助其他遇到同样问题的人......我遇到了完全相同的问题
在您的 Content Provider 类中的 Query 方法中,在设置通知 Uri 之前。确保更新和删除 Uri 与查询 Uri 相同。
uri = Uri.parse("content://com.casselsinthecloud.cloudbeats.provider/playlist_contents");
然后用新的 Uri 调用 setNotificationUri(...) ..
cursor.setNotificationUri(getContext().getContentResolver(), uri);
这将确保 CursorLoader 动态更新..
【讨论】:
以上是关于指向内容提供者中的加入查询的游标加载器未更新列表的主要内容,如果未能解决你的问题,请参考以下文章
为啥 ContentProvider 在 App 更新后返回空游标?