【问题标题】:Cursor or database not closed error光标或数据库未关闭错误
【发布时间】:2011-12-16 03:34:39
【问题描述】:

我已经使用 sqlite 制作了一些多活动数据库应用程序, 但我在 logcat 中收到错误消息,例如

完成一个尚未停用或关闭的游标 或数据库未关闭错误

我的应用程序似乎运行良好。 我尝试使用 onDestroy 或在查询后或更改活动时关闭游标和数据库, 但随后要么应用程序崩溃,要么我得到空指针异常或空列表视图。

我想知道如果我保持现状,我会遇到什么问题, 例如数据库损坏或与其他应用程序的干扰。

我也想知道如果我声明游标

protected Cursor a_cursor;

在第一个活动中,我是否需要在下一个活动中使用相同的声明 还是我需要使用

protected Cursor b_cursor;

对于第一个活动中的 DbHelper、Context、Sqlitedatabase 等类似

 private SQLiteDatabase adb;
 private DatabaseHelper aDbHelper;
    private final Context aCtx; 

 private SQLiteDatabase bdb;
 private DatabaseHelper bDbHelper;
    private final Context bCtx;

在第二个活动中

程序的结构是这样的

DatabaseHelper -- 创建一些表或升级

DbAdapter -- 插入或更新表

Activity1 -- 搜索表格和列表视图 -- 在列表 itemclick --Activity2 上, 上下文菜单向第二个表添加一些细节

Activity2 -- Activity3 的项目详细信息和按钮

Activity3——编辑项目——返回

Activity4 -- 第二个表列表视图

Activity5 -- 数据库导入导出

抱歉,如果我的问题看起来过于简单或原始 但我不是程序员,这些应用程序仅供我个人使用 不适合市场​​

实际上我没有找到适合我需要的完整示例 所以我只是从许多示例中添加了一些细节来完成任务

【问题讨论】:

    标签: android sqlite


    【解决方案1】:

    过去我们会说使用managedQuery 来处理这些东西。但是由于添加了CursorLoader,我建议使用它来保持一切正常。直到 API Level-10 才添加游标加载器,但您仍然可以通过 Support Package 在较低的 API 级别上使用它。

    有关使用 CursorLoader 的示例,您可以查看此Example(或相应的full-fledged example。)

    【讨论】:

    • 如果我没记错的话,managedQuery 已经在 api 级别 10 中被弃用。在以前的项目中使用过它,因为它有太多的 memObj/cursor 问题。是的,使用装载机。
    • 是的,这就是为什么我说“我们曾经使用它”以及为什么我说他应该使用 CursorLoader 代替。
    • 感谢 Kurtis 的回复。我在 API 8 上,所以我可以使用 managedQuery 你有 sn-p 或 managedQuery 的例子吗
    • 我还没有找到任何解决这个荒谬错误的方法。就我而言,我正在关闭一切,但 Android 有所不同。我将为 CursorLoader 构建 API 10 之后的所有内容。
    • 还有关于数据库损坏问题和游标声明的任何 cmets
    【解决方案2】:

    填充光标时,尝试这样做

    Cursor c;
    try {
       c = managedQuery...
       lv.setAdapter(c);
    } catch(...) {
    } finally {
       if(null!=c)
       c.close()
    }
    

    【讨论】:

    • 谢谢 Josephus,我会试试这个并发布结果
    • 我认为 managedQuery 只适用于内容提供者,所以我可能不会使用它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    相关资源
    最近更新 更多