尝试关闭SQLite数据库时应用程序强制关闭

问题描述:

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

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();

任何想法,为什么试图关闭数据库会给一个空指针异常?

+0

dbHelper可能已经自动在活动推入后台关闭。顺便说一句,为什么不只是打开连接,当你需要他们? – 2011-08-11 02:49:11

+0

我对于应用程序是否最好有1个dbHelper,或者随时打开和关闭,我看到了不同的看法,所以现在是这样,但我不知道哪种设计最好。 – Pikaling

+0

此外,该应用程序的主要活动是一组使用游标的选项卡,并且这些选项卡填充在异步任务中,所以我不想在运行时终止数据库连接 – Pikaling

我们真的不知道为什么没有看到您的代码,但显然您的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; 
    } 

} 
+0

嗨。谢谢你的帮助。你能否详细说明一下你的'为你的数据库创建一个单例类'的建议? – Pikaling

+0

查看修改后的帖子。基本上有你的数据库帮助类的单个实例访问您的所有活动等 –

+0

啊,我明白了。我已经将数据库帮助作为单例实现,但是在超类Activity中进行处理。无论如何,删除'dbHelper.close()'语句已经停止强制关闭,现在一切似乎都很好,谢谢 – Pikaling