【发布时间】: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?请注意,我还没有进入ContentProviders!希望你能找到答案,我也很好奇。同时你可以试试onResume:getLoaderManager().getLoader(id).onContentChanged(); -
数据分别插入到表中,然后在连接中读回。您所说的可能是问题的原因。
-
@TWiStErRob 你建议使用
onResume: getLoaderManager().getLoader(id).onContentChanged();是一个好习惯吗?它有效,但我想知道它是否是最佳选择。 -
直到我们无法回答“它如何知道哪些其他 Uris 依赖于 A?”,这是始终显示最新数据的最佳选择。我使用的是 DB 游标而不是 ContentProvider 游标,所以我必须调用它。我由
!getLoaderManager().hasRunningLoaders()守护它。 -
我会尝试使用视图(将 dp 保存在数据库中。