首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >没有内容提供商的android - CursorLoader & SQLite

没有内容提供商的android - CursorLoader & SQLite
EN

Stack Overflow用户
提问于 2012-10-13 10:16:45
回答 3查看 21.4K关注 0票数 54

我知道这件事已经讨论过了,但我想问一下事情的现状。我必须创建一个ContentProvider才能将CursorLoader与sqlite数据库结合使用吗?

我发现

CursorLoader usage without ContentProvider

正如Emmby评论的那样,看起来正是我所希望的

  • 用户应该注意一个限制,那就是它没有在数据更改时刷新

的机制(正如加载器应该做的那样

所以这里提到了另一种解决方案

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

但还是指出了一些缺点。

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

当然,在使用LoaderManager时,我们希望获得它引入时的所有好处。所以我的问题是,是否有一种方法可以在不实现内容提供者的情况下将LoaderManager与sqlite数据库结合使用,同时又能享受到它的所有好处。

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-13 10:58:57

你在文章中提到的两个实现都提供了CursorLoader 的所有好处,除了当底层内容发生变化时接收通知的能力。

我最近研究了很多,我可以自信地告诉你,Android API目前没有提供一种只使用原始SQLiteDatabase来实现这一点的方法(它只提供了ContentResolver#notifyChange()Cursor#setNotificationUri()方法,这两个方法用于通知所有在某个通知Uri下注册的Cursor)。

也就是说,你现在的选择是:

  1. 自己实现了一个观察器,它能够在内容更改时接收来自SQLiteDatabase的通知,并且能够以某种方式将这些通知转发给应用程序中的所有现有Loader。我写了一个相当广泛的关于如何实现Loader的,如果你想接受这个挑战,它可能会派上用场。或者...
  2. 使用Mark Murphy的LoaderEx库,并且只使用他的库提供的AsyncTask操作进行数据库修改。请注意,他的任务刷新Loader的原因是,它们在执行插入/更新/删除操作后立即调用Loader上的onContentChanged,有效地告诉Loader内容已更改,应该刷新其数据。
  3. 只需使用具有CursorLoaderContentProvider,您可以使用ContentResolver#notifyChange()方法通知<代码>D27发生了内容更改。<代码>H228<代码>G229

我正在尝试找出一个更好的解决方案,如果我找到/实现了一个解决方案,我会在未来向您报告,但目前这些解决方案已经足够了。

票数 66
EN

Stack Overflow用户

发布于 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);
票数 2
EN

Stack Overflow用户

发布于 2021-08-25 15:59:15

将共享首选项中的布尔值设置为false会怎么样?当布尔值为真时更新内容...当任何改变底层数据库的操作..该布尔值将被设置为true,并且作为共享首选项,您可以在调用相关方法后直接接收实时更改

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12869373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档