Android CursorLoader,尝试重新查询已经关闭的游标

2024-01-10

我刚刚开始使用新的cursorLoader,但遇到了问题。下面的代码只是为了理解cursorLoader是如何工作的,但我不断得到:

当我恢复此活动时,“尝试重新查询已关闭的游标”。在我开始使用 CursorLoader 之前,该应用程序运行良好。有任何想法吗?

private Cursor getSectionData(CharSequence parent_id) {
    
    String[] projection = new String[] {Titles.SECTION, Titles.TITLE, Titles._ID, Titles.CODE_RANGE,};
    Uri titles =  Titles.CONTENT_URI;
    String select = "" + Titles.PARENT_ID + " match " + parent_id + "";
    CursorLoader loader = new CursorLoader(this, titles, projection, select, null, null);
    Cursor cTitles = loader.loadInBackground();
    
    
    String[] projection1 = new String[] {Codes.CODE, Codes.EXCERPT, Codes._ID,};
    Uri codes =  Codes.CONTENT_URI;
    String select1 = "" + Codes.PARENT_ID + " match " + parent_id + "";
    CursorLoader loader1 = new CursorLoader(this, codes, projection1, select1, null, null);
    Cursor cCodes = loader1.loadInBackground();

    
    
    //Cursor cTitles = db.rawQuery("select section, title, _id, code_range from titles where parent_id match " + parent_id + "", null);
    //startManagingCursor(cTitles);
    //Cursor cCodes = db.rawQuery("select code, excerpt, _id from codes where parent_id match " + parent_id + "", null);
    
    mQuery = "select code, excerpt, _id from codes where parent_id match " + parent_id + "";
    
    //startManagingCursor(cCodes);
    Cursor[] c = {cTitles, cCodes};
    Cursor cursor = new MergeCursor(c);
    startManagingCursor(cursor);
    
    return cursor;

}

我不相信从 loader.loadInBackground() 捕获光标是您想要的。 loadInBackground() 的实现基本上会执行一个查询并返回 UI 线程上的光标,这是您试图避免的。

任何时候在 UI 线程上等待返回值时都要小心。这应该是一个很好的指标,表明这不是您想要的。

我为解决此问题所做的就是重新启动加载程序。 就我而言,我尝试使用操作栏来搜索我的内容。 我的类扩展了 ListFragment 并实现了 LoaderManager.LoaderCallbacks 容纳此功能的 Activity 实现了 OnQueryTextListener 并调用此处的片段,这是我在片段中执行的代码。

public void doSearch(String query) {
    Bundle bundle = new Bundle();
    bundle.putString("query", query);

    getLoaderManager().restartLoader(LoaderMangerIdHelper.INVENTORY, bundle, this);
}

请注意,您必须重新启动加载程序。加载器全部由系统管理。这将导致您的 onCreateLoader 被重新调用。因此,您必须检查其中的查询字符串来设置您的选择。

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle bundle) {
    String SELECTION = "someColumn=?";
    List<String> selectionArgs = new ArrayList<String>();
    selectionArgs.add("someArgs");

    if (bundle != null && bundle.containsKey("query")) {
        SELECTION += " AND columnTitle LIKE ?";
        selectionArgs.add(bundle.getString("query") + "%");
    }

    final String[] SELECTION_ARGS = new String[selectionArgs.size()];
    selectionArgs.toArray(SELECTION_ARGS);

    mLoader = new CursorLoader(getActivity(), RoamPay.Product.CONTENT_URI, null, SELECTION,
            SELECTION_ARGS, null);

    return mLoader;
}

这将在后台启动光标加载。并且回调应该和平常一样。

   @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        // Swap the new cursor in. (The framework will take care of closing the
        // old cursor once we return.)
        mAdapter.swapCursor(data);

        // The list should now be shown.
        if (isResumed()) {
            setListShown(true);
        } else {
            setListShownNoAnimation(true);
        }
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        // This is called when the last Cursor provided to onLoadFinished()
        // above is about to be closed. We need to make sure we are no
        // longer using it.
        mAdapter.swapCursor(null);
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android CursorLoader,尝试重新查询已经关闭的游标 的相关文章

随机推荐

  • 如何将 system.drawing.image 转换为 system.web.ui.webcontrols.image

    我用来以字节为单位存储图像并能够将其转换为 system drawing image 但不确定如何在页面上呈现它 Thanks 您可以创建 ASPX 页面 该页面将图像文件作为带有适当标题信息的字节数组返回 要获取图像 您可以像这样调用此页
  • WPF ListBox WrapPanel 剪辑长组

    我创建了一个列表框来按组显示项目 当组不再适合列表框面板的高度时 它们会从右到左换行 因此 组在列表框中的显示与此类似 其中每个组的高度是任意的 例如 组 1 的高度是组 2 的两倍 1 3 5 4 6 2 以下 XAML 工作正常 因为它
  • malloc 如何与严格别名一起工作 - 它只能在单个编译单元内被违反吗?

    看完之后this https stackoverflow com questions 54237004 strict aliasing rule uint8 t buffer to structure 我有一个类似的问题this one h
  • 在 OSX 和 Mono 上使用 C# 进行开发

    我即将启动一个需要我编写 C 代码的项目 问题是 我有一台 Mac 我想知道在 OSX 10 6 上使用 mono 进行 c 开发是否存在任何陷阱 我认为该页面很清楚 实现很清晰 但另一方面 我读到人们安装 VMWare 或类似的东西来使用
  • 如何提交不更改和新消息?

    我怎样才能制作一个新的commit如果没有对文件进行任何更改 则创建一条新消息 这是不可能的 因为提交的代码 SHA 将是相同的 很少有充分的理由这样做 但参数是 allow empty对于空提交 没有更改文件 与 allow empty
  • Pandas groupby 结合 sklean 预处理续

    从这篇文章继续 Pandas groupby 与 sklearn 预处理相结合 https stackoverflow com questions 42772758 pandas groupby in combination with sk
  • JavaScript 中数组扩展语法的替代方案

    所以我正在使用使用 ES5 JavaScript 的旧代码库 这意味着我无法传播数组 var listOfItems item1 test 1 item2 test2 2 var docDefinition style piecesTabl
  • 如何创建一个有时间限制的哈希/密钥?

    我正在尝试创建一个有时间限制的密钥以在我的一个应用程序中使用 该密钥用于解锁应用程序中的某些功能 到目前为止我的想法是 生成 加密哈希我需要的各种信息 密钥生成日期 验证 加密哈希我需要的各种信息 现在的日期 如果所有信息都相同且日期相同
  • facebook-api:Facebook Connect 跨域接收者 URL 是什么?

    我正在尝试配置我的 Facebook 应用程序可调整大小 文档位于http wiki developers facebook com index php Ressized IFrame http wiki developers facebo
  • 编译时检查特征特化是否具有唯一的 id

    我看过很多帖子解释如何为类生成唯一的 id 就我而言 id 由用户选择 出于各种原因 但我想确保没有 id 在不同的类中使用两次 我将问题简化为以下代码 struct A struct B template
  • html.hidden 未在 asp.net MVC 核心 Razor 视图中设置值

    我正在开发一个 ASP NET MVC 核心应用程序 我有一个带有如下表单元素的弹出窗口 using Html BeginForm AddIVR ITPVoice FormMethod Post new role form Html Hid
  • 应用程序处理错误:意外的 CFBundleExecutable 密钥

    我正在尝试在启用 bitCode 的情况下向 Apple 提交 每次我提交时我都会收到这封电子邮件 我们发现您最近交付的 MyAPPP 存在一个或多个问题 要处理您的交货 必须纠正以下问题 意外CFBundle可执行密钥 Payload M
  • Sass 从模块扩展类

    使用 sass 中的新模块系统 使用 use 而不是 import 我如何在一个文件中定义一个类并使用 extend 在另一个文件中使用它 File 颜色 scss element background color blue 主文件 use
  • 如何将包发布到 TeamCity nuget 服务器?

    我们有一个为 nuget 配置的 TeamCity 7 服务器 它托管在没有外部连接的计算机上 是否可以将包发布到 TeamCity nuget 服务器 例如 如果我们想要将 log4net 包依赖项添加到我们的项目之一 则需要将其发布到
  • 查找数组中大于或等于N的数

    如果我有一个 PHP 数组 array 具有价值观 45 41 40 39 37 31 我有一个变量 number 38 如何返回值 39 因为这是数组中最接近 38 向上计数 的值 Regards taylor
  • 通过 fontforge 脚本获取字形宽度

    为了获取字形宽度 我将TTF字体为AFM 然后解析内容AFM文件来获取每个字形的宽度 由于从技术上来说 fontforge正在从二进制文件中捕获字形宽度TTF文件 然后创建一个AFM字体文件基于AFM标准模板 我想知道是否可以直接转换TTF
  • 如何检查 django 模板中的复选框是否被选中

    我需要检查 django 模板中是否选中了复选框 如果为 False 则打开其他一些字段 我已经尝试过类似的事情 if closed in is closed 但无论复选框是否选中 它们始终为 True 这是我在模板中的复选框属性
  • 如何在c#中获取先前的控制权

    如何在c 中获取先前的控制权 有一种方法可以GetNextControl但没有办法获得先前的控制权 谁能告诉我如何得到这个 提前致谢 GetNextControl Control control bool forward 您可以指定是否要向
  • 将最喜欢的方法添加到 IntelliJ 中的静态导入?

    在 Eclipse 中 可以配置某些 最喜欢的 类 在调用代码完成时将查找这些类 以查看是否可以为方法添加静态导入 这位于首选项 gt Java gt 编辑器 gt 内容辅助 gt 收藏夹 例如 我可以开始输入assertT Eclipse
  • Android CursorLoader,尝试重新查询已经关闭的游标

    我刚刚开始使用新的cursorLoader 但遇到了问题 下面的代码只是为了理解cursorLoader是如何工作的 但我不断得到 当我恢复此活动时 尝试重新查询已关闭的游标 在我开始使用 CursorLoader 之前 该应用程序运行良好