【问题标题】:Application force close when trying to close SQLite database尝试关闭 SQLite 数据库时应用程序强制关闭
【发布时间】:2011-08-11 02:41:35
【问题描述】:

我的 Android 应用程序中有一个我的活动 (WhereWolfActivity) 的超类,它有一个静态 SQLiteDatabaseOpenHelper 供所有子类使用。数据库连接在 onCreate 中打开并在 onDestroy 中关闭(我会跟踪打开的子类 Activity 的数量,以确保仅在应用程序中的最后一个 Activity 被销毁时才关闭数据库连接)。当用户注销时,他们会被带到一个欢迎屏幕 Activity,它不是 WhereWolfActivity 的子类,因此数据库连接被关闭。但是,当应用程序注销时应用程序强制关闭并且我得到以下 logcat 输出:

08-11 02:28:24.858: ERROR/AndroidRuntime(29022): FATAL EXCEPTION: main
08-11 02:28:24.858: ERROR/AndroidRuntime(29022): java.lang.RuntimeException: Unable to destroy activity {uk.ac.ic.doc.vmw10.wherewolf/uk.ac.ic.doc.vmw10.wherewolf.activities.Tabs}: java.lang.NullPointerException
08-11 02:28:24.858: ERROR/AndroidRuntime(29022):     at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3655)
08-11 02:28:24.858: ERROR/AndroidRuntime(29022):     at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3673)
08-11 02:28:24.858: ERROR/AndroidRuntime(29022):     at android.app.ActivityThread.access$2900(ActivityThread.java:125)
08-11 02:28:24.858: ERROR/AndroidRuntime(29022):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
08-11 02:28:24.858: ERROR/AndroidRuntime(29022):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-11 02:28:24.858: ERROR/AndroidRuntime(29022):     at android.os.Looper.loop(Looper.java:123)
08-11 02:28:24.858: ERROR/AndroidRuntime(29022):     at android.app.ActivityThread.main(ActivityThread.java:4627)
08-11 02:28:24.858: ERROR/AndroidRuntime(29022):     at java.lang.reflect.Method.invokeNative(Native Method)
08-11 02:28:24.858: ERROR/AndroidRuntime(29022):     at java.lang.reflect.Method.invoke(Method.java:521)
08-11 02:28:24.858: ERROR/AndroidRuntime(29022):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-11 02:28:24.858: ERROR/AndroidRuntime(29022):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-11 02:28:24.858: ERROR/AndroidRuntime(29022):     at dalvik.system.NativeStart.main(Native Method)
08-11 02:28:24.858: ERROR/AndroidRuntime(29022): Caused by: java.lang.NullPointerException
08-11 02:28:24.858: ERROR/AndroidRuntime(29022):     at uk.ac.ic.doc.vmw10.wherewolf.activities.WhereWolfActivity.onDestroy(WhereWolfActivity.java:119)
08-11 02:28:24.858: ERROR/AndroidRuntime(29022):     at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3642)
08-11 02:28:24.858: ERROR/AndroidRuntime(29022):     ... 11 more

NullPointerException 发生在以下行:dbHelper.close();

知道为什么尝试关闭数据库会产生空指针异常吗?

【问题讨论】:

  • dbHelper 可能在活动被推入后台时自动关闭。顺便说一句,为什么不在需要时打开连接?
  • 对于应用程序最好有 1 个 dbHelper 还是随手打开和关闭,我看到了不同的意见,所以目前是这样,但我不知道哪个设计是最好的。
  • 另外,应用程序的主要活动是一组使用游标的选项卡,这些选项卡填充在异步任务中,所以我不想在它们运行时终止数据库连接

标签: android sqlite


【解决方案1】:

如果没有看到您的代码,我们真的无法知道为什么,但显然您的 dbHelper 为空。这与试图关闭它无关。

另一方面,让您的生活更简单,并为您的数据库设置一个单例类。至于关闭,您实际上并不需要这样做,只需将其打开即可。当您的进程终止时,它将负责关闭数据库。确保关闭所有光标。

类似:

public class MyDbHelper extends SQLiteOpenHelper {

    private Context context;

    private static MyDbHelper instance;

    public static MyDbHelper getInstance(Context context) {
        if (instance == null) {
            instance = new MyDbHelper(context);
        }

        return instance;
    }

}

【讨论】:

  • 嗨。谢谢你的帮助。您能否详细说明您关于“为您的数据库设置一个单例类”的建议?
  • 查看修改后的帖子。基本上,您的所有活动等都可以访问您的数据库助手类的单个实例。
  • 啊,我明白了。我已经将数据库助手实现为单例,而是在超类 Activity 中处理它。无论如何,删除 dbHelper.close() 语句已停止强制关闭,现在一切正常,谢谢
猜你喜欢
  • 2013-09-15
  • 1970-01-01
  • 2020-08-18
  • 1970-01-01
  • 2012-10-16
  • 2011-12-29
  • 2017-06-17
  • 2013-01-28
  • 1970-01-01
相关资源
最近更新 更多