【问题标题】: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 插入新数据?我认为如果您插入到AB,那么只有AB 的光标会被刷新,但是如果您有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 保存在数据库中。

标签: android sql


【解决方案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 动态更新..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    相关资源
    最近更新 更多