当前位置: 首页 > 知识库问答 >
问题:

IllegalStateException:数据库已关闭(使用ViewPager)

蒙华翰
2023-03-14

我的代码:

public Cursor fetchIncompleteAssignments(Short course) {
    DbAdapter adapter = new DbAdapter(context, null, Values.ASSIGNMENT_TABLE);
    adapter.open();

    Cursor r;
    if (course == null) // Fetching from all courses
        r = adapter.fetchAllWhere(Values.ASSIGNMENT_LIST_FETCH, Values.ASSIGNMENT_KEY_STATUS + "=" + 0, Values.ASSIGNMENT_KEY_DUE_DATE);
    else
        r = adapter.fetchAllWhere(Values.ASSIGNMENT_LIST_FETCH, Values.ASSIGNMENT_KEY_COURSE + "=" + course
            + " AND " + Values.ASSIGNMENT_KEY_STATUS + "=" + 0, Values.ASSIGNMENT_KEY_DUE_DATE);
    adapter.close();
    return r;
}

// Part of DbAdapter:
public DbAdapter open() throws SQLException {
    dbHelper = new DatabaseHelper(context);
    db = dbHelper.getWritableDatabase();
    return this;
}

public void close() {
    if (db != null) {
        try {
            db.close();
            dbHelper.close();
        } catch (NullPointerException e) {
            Log.e("Close", "Error: " + e + " " + e.getMessage());
        }
    } else
        Log.e("Close", "Error! db \"" + DATABASE_TABLE + "\" is null.");
}

FetChallAssignments()返回的游标用于通过自定义的CursorAdapter填充ListViewListViewListFragment的内容,并且在ViewPager的每个页面中都显示了此ListFragment的多个实例(一个用于显示所有课程的作业,然后是每个单独课程的一个页面)。

你知道哪里出了问题吗?据我所知,我正在正确地关闭我的数据库。如果你需要更多代码请告诉我。提前道谢!

编辑:数据是从数据库中提取的,它也填充了ListView。我可以刷过各种页面,但它似乎崩溃每当碎片停止。当我开始另一个活动时,它经常会崩溃,但不总是。当我浏览网页时,它也会偶尔崩溃,虽然很少。下面是我的片段的onPause()方法(我没有onStop()或onDestroy()):

public void onPause() {
    super.onPause();
    if (!assignmentsCursor.isClosed()) {
        assignmentsCursor.close();
        assignmentsCursor = null;
    }
}

在我的onResume()中,我只是从数据库重新加载列表,并通过getActivity()获得上下文的新副本。也许有些东西正在被清除(为了内存的目的),而我没有重新加载它?我没有得到任何类型的NullPointerException,所以在我看来这不太可能...

共有1个答案

殳凯捷
2023-03-14

实际上,引发此异常是因为您双倍关闭了数据库,而不是因为您没有关闭它。

所以..

close()方法中,替换代码中的以下行:

if (db != null) {
if (db != null && db.isOpen()) {
 类似资料:
  • 因此,当我在表单上输入信息后,它会用新表单刷新new.php页面,但不会提交任何信息。我没有错误,就像我在页面上点击刷新一样。我觉得我做的一切都是对的,但我似乎不明白为什么这不起作用。我刚刚从mysql过渡到mysqli,所以我有点像新手。它也没有回到home.php. new.php

  • 问题内容: 我有些困惑,我从阅读以下内容 你不需要关闭conn连接吗?如果conn.close()没有发生,那实际上是怎么回事? 我有一个正在维护的私有Web应用程序,该应用程序当前无法关闭任何一种形式,但是重要的应用程序真的是stmt,conn还是两者兼而有之? 该站点间歇性地关闭,但是服务器一直在说这是数据库连接问题,我怀疑它没有关闭,但是我不知道该关闭哪个。 问题答案: 使用完之后,你需要通

  • 问题内容: 我正在尝试使用Stream API生成Order实例。我有一个创建订单的工厂函数,并且使用DoubleStream初始化订单金额。 如果我使用文字(1.0)初始化Order实例,则可以正常工作。当我使用doubleStream创建随机数量时,将引发异常。 问题答案: 答案在(重点是我的)的javadoc中: 流仅应操作一次(调用中间流或终端流操作) 。例如,这排除了“分叉”流,其中相同

  • 我正尝试使用一个复选框来使用jQuery更新ID行处的数据库。 我正在使用while循环填充表。JQuery对第1行起作用,正确更新ID为xx的复选框的1或0。当您单击任何其他行时,它会正确地标识ID,但不会返回复选框值。 PHP代码: AJAX代码:

  • 在学习熊猫的过程中,我已经尝试了好几个月来找出这个问题的答案。我在日常工作中使用SAS,这是非常好的,因为它提供了非核心支持。然而,SAS作为一个软件是可怕的,原因还有很多。 有一天,我希望用python和熊猫取代SAS,但我目前缺乏大型数据集的核心外工作流。我说的不是需要分布式网络的“大数据”,而是文件太大,无法放入内存,但又小到足以放入硬盘。 我的第一个想法是使用在磁盘上保存大型数据集,只将我