Приложение закрывается при попытке закрыть базу данных SQLite - PullRequest
0 голосов
/ 11 августа 2011

У меня есть суперкласс для моей деятельности (WhereWolfActivity) в моем приложении для Android, в котором есть статический SQLiteDatabaseOpenHelper для всех подклассов. Соединение с базой данных открывается в onCreate и закрывается в onDestroy (я отслеживаю количество открытых операций подкласса, чтобы гарантировать, что соединение с базой данных закрыто только после уничтожения последней активности в приложении). Когда пользователь выходит из системы, он попадает на экран приветствия 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();

Любая идея, почему попытка закрыть базу данных приведет к исключению нулевого указателя?

1 Ответ

0 голосов
/ 11 августа 2011

Мы не можем знать почему, не увидев ваш код, но, очевидно, ваш 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;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...