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

2024-03-09

我对导致此错误的原因感到困惑,因为我已确保正确关闭数据库适配器(至少我认为是)。以下是 LogCat 的说法(所有这些标签的标签都是 AndroidRuntime):

致命异常:主要 java.lang.IllegalStateException:数据库/data/data/com.acedit.assignamo/databases/data.db(conn#0)已经关闭 在 android.database.sqlite.SQLiteDatabase.verifyDbIsOpen(SQLiteDatabase.java:2082) 在 android.database.sqlite.SQLiteDatabase.lock(SQLiteDatabase.java:413) 在 android.database.sqlite.SQLiteDatabase.lock(SQLiteDatabase.java:400) 在 android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:79) 在 android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:164) 在 android.database.sqlite.SQLiteCursor.onMove(SQLiteCursor.java:147) 在 android.database.AbstractCursor.moveToPosition(AbstractCursor.java:178) 在 android.support.v4.widget.CursorAdapter.getItemId(CursorAdapter.java:225) 在 android.widget.AbsListView.onSaveInstanceState(AbsListView.java:1569) 在 android.view.View.dispatchSaveInstanceState(View.java:9868) 在 android.view.ViewGroup.dispatchFreezeSelfOnly(ViewGroup.java:2310) 在 android.widget.AdapterView.dispatchSaveInstanceState(AdapterView.java:770) 在 android.view.ViewGroup.dispatchSaveInstanceState(ViewGroup.java:2296) 在 android.view.View.saveHierarchyState(View.java:9851) 在 android.support.v4.app.FragmentManagerImpl.saveFragmentViewState(FragmentManager.java:1561) 在 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:962) 在 android.support.v4.app.FragmentManagerImpl.detachFragment(FragmentManager.java:1233) 在 android.support.v4.app.BackStackRecord.run(BackStackRecord.java:620) 在 android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1431) 在 android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:431) 在 android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141) 在 android.support.v4.view.ViewPager.populate(ViewPager.java:895) 在 android.support.v4.view.ViewPager.populate(ViewPager.java:772) 在 android.support.v4.view.ViewPager.completeScroll(ViewPager.java:1539) 在 android.support.v4.view.ViewPager.computeScroll(ViewPager.java:1422) 在 android.view.View.getDisplayList(View.java:10406) 在 android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2597) 在 android.view.View.getDisplayList(View.java:10380) 在 android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2597) 在 android.view.View.getDisplayList(View.java:10380) 在 android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2597) 在 android.view.View.getDisplayList(View.java:10380) 在 android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2597) 在 android.view.View.getDisplayList(View.java:10380) 在 android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:875) 在 android.view.ViewRootImpl.draw(ViewRootImpl.java:1910) 在 android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1634) 在 android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:137) 在 android.app.ActivityThread.main(ActivityThread.java:4575) 在 java.lang.reflect.Method.invokeNative(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:511) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 在dalvik.system.NativeStart.main(本机方法)

My code:

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.");
}

The Cursor从返回fetchAllAssignments()用于填充ListView通过习俗CursorAdapter. The ListView是a的内容ListFragment,并且 ViewPager 的每一页中显示此 ListFragment 的多个实例(一个用于显示所有课程的作业,然后一个用于显示每个单独课程的页面)。

关于哪里出了问题有什么想法吗?据我所知,我正在正确关闭数据库。如果您需要更多代码,请告诉我。提前致谢!

EDIT:数据从数据库中提取出来,并且也填充到 ListView 中。我可以滑动各个页面,但每当片段停止时它似乎都会崩溃。当我启动另一个活动时,它经常会崩溃,但并非总是如此。当我滑动页面时,它偶尔也会崩溃,尽管这种情况很少。这是我的 Fragment 的 onPause() 方法(我没有 onStop() 或 onDestroy()):

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

In my onResume()我只是从数据库重新加载列表并通过以下方式获取上下文的新副本getActivity()。也许某些东西正在被清除(出于记忆目的)并且我没有重新加载它?我没有收到任何类型的 NullPointerException,所以这对我来说似乎不太可能......


这个异常实际上是因为你双重关闭数据库而引发的,而不是因为你没有关闭它。

so..

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

if (db != null) {

with:

if (db != null && db.isOpen()) {
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IllegalStateException:数据库已关闭(使用 ViewPager) 的相关文章

随机推荐

  • 如何从 vbscript 中的 html 页面中提取值 - 我尝试了 MSXML2.DOMDocument

    下面是我尝试从网页中的节点获取值的一些代码 但在尝试设置 objNode 时失败 非常感谢任何帮助 Dim objHttp sWebPage objNode objDoc Set objDoc CreateObject MSXML2 DOM
  • 连锁承诺并保留“这个”

    我有一个点击处理程序 需要一个接一个地进行多个异步调用 我选择使用承诺来构建这些调用 RSVP https github com tildeio rsvp js 准确地说 下面 您可以看到clickA处理程序 在控制器内部 这是一个 Emb
  • 错误:该元素具有 type 属性以及匿名子类型

    具有 type 属性的嵌套复杂 XSD 元素 只是想弄清楚为什么 XSD 中的复杂元素不能有类型属性和嵌套的复杂元素 毕竟类型只是用户定义的数据类型 因此应该能够包含任何内容 包括其他用户定义的数据类型 XSD 解析器抛出错误 该元素具有
  • ggplot2:标签表达式中的字体样式

    更改字体和大小效果很好 无需在标签中表达 这是我在更改标签表达式中的字体时遇到问题的代码 p lt ggplot data mtcars aes x wt y mpg geom point labs x Weight y expressio
  • androidx.work.impl.WorkManagerInitializer:java.lang.ClassNotFoundException:路径上的“androidx.work.impl.WorkManagerInitializer”:/data

    我最近将旧应用程序的后台服务迁移到工作经理 https developer android com topic libraries architecture workmanager 在最近的设备上 低至包含 SDK 22 看起来不错 运行重
  • 解封时出现属性错误:无法获取属性“位置”

    我正在为库存系统编写 Python CGI 脚本 需要通过存储pickle一个列表 称为locations 的对象 这是我正在使用的代码 try with open config autosave bin rb as dataFile lo
  • 整数分数约简算法

    这来源于最近完成的一次编程比赛 给你两个 10 5 整数的数组 范围在 1 10 7 含 内 int N 100000 int D 100000 想象有理数 X 是 N 的所有元素相乘并除以 D 的所有元素的结果 修改两个数组而不更改 X
  • Bootstrap 3 导航栏 - 无法正确折叠

    导航栏曾经正常工作 但我做了一些更改 它不再工作 当我将窗口缩小时 会显示切换方块 但是当我单击它时 什么也没有发生 Note 导航栏在全屏下工作正常 它只是在小窗口中 当我单击切换按钮时 下拉菜单不会出现 想知道是否有人知道如何解决它 这
  • 无法在 Eclipse 上调试基于 Android 库构建的 Android 本机代码

    我已经为此苦苦挣扎了三天 但无法完成 我有一个 android 项目 它链接到 eclipse 上的 android 库 其中包含本机代码 I saw 这个问题 https stackoverflow com questions 12638
  • pandas - 获取日期时间数据框中每天的第一个和最后一个值

    我有一个月的数据框 不包括周六和周日 每 1 分钟记录一次 v1 v2 2017 04 03 09 15 00 35 7 35 4 2017 04 03 09 16 00 28 7 28 5 2017 04 03 16 29 00 81 7
  • 处理表中的溢出

    如果我有一个像这样非常非常简单的例子的表 table table layout fixed width 300px td1 width 100px td2 width 200px 在我的其中之一 td2包含一个图像 可以说 300px in
  • C++ 删除静态数据

    如果我有一个类 其中包含分配在堆上且永不更改的私有静态数据 那么我应该什么时候 如果有的话 删除它 据我了解 类本身永远不会被构造 因为类不是 C 中的第一类对象 那么没有析构函数来删除其中的静态数据 我是 C 新手 如果我对 C 的理解有
  • 如何使用logstash插件-logstash-input-http

    我正在探索 Logstash 以接收 HTTP 上的输入 我已经使用以下方式安装了 http 插件 插件安装logstash input http 安装成功 然后我尝试使用以下命令运行logstash Logstash e 输入 http
  • R:Tibble 与 ggplot2(绘制图表)

    我正在尝试遵循 R 中的教程 https rviews rstudio com 2017 09 25 survival analysis with r https rviews rstudio com 2017 09 25 survival
  • 当用户调整 QMainWindow 大小时如何分配回调?

    我既无法在 QMainWindow 上找到类似教程的调整大小事件方案 也没有在 Qt 设计窗口的下拉菜单中看到任何用于添加调整大小事件的选项 我是 Qt 新手 我想为 QMainWindow 调整大小事件编写一个槽函数 有这样的活动吗 我怎
  • 在 Excel 中设置 csv 文件格式

    Win XP Excel 2007 我知道还有很多关于 csv 格式的其他帖子 但无法找到我需要的内容 我们的一些数据被另一家公司保存在异地 他们每天早上都会向我们发送包含前几天数据的 csv 文件 问题是这些数据来自可能具有下拉列表的网络
  • 使用sync_imports()在IPython.parallel引擎上导入自定义模块

    我一直在玩 IPython parallel 我想使用我自己的一些自定义模块 但无法按照上的说明进行操作烹饪书 http ipython org ipython doc stable parallel parallel multiengin
  • Nifty Modal - 如何在没有按钮的情况下触发模式

    这个脚本 http stuff wp dreams com modal 提供了很棒的模式转换 我想使用它们而不是标准的警报消息 现在脚本的演示展示了如何通过按 a 来触发它们
  • 如何从 R 读取换行符分隔的 JSON 文件?

    我有一个换行符分隔 即每个 JSON 对象仅限于文件中的 1 行 name json1 name json2 name json3 在Python中 我可以轻松地阅读它 如下所示 我必须使用编码encoding cp850 读取我的真实数据
  • IllegalStateException:数据库已关闭(使用 ViewPager)

    我对导致此错误的原因感到困惑 因为我已确保正确关闭数据库适配器 至少我认为是 以下是 LogCat 的说法 所有这些标签的标签都是 AndroidRuntime 致命异常 主要 java lang IllegalStateException