Почему некоторые пользователи получают FC на database.close? - PullRequest
0 голосов
/ 23 июня 2011

У меня есть следующий код:

public class DbAdapter {
...
    public DbAdapter open() throws SQLException {
        mDbHelper = new DatabaseHelper(mCtx);
        mDb = mDbHelper.getWritableDatabase();
        return this;
    }

    public void close() {
        mDbHelper.close();
    }
...

Этот метод close вызывается в onDestroy of MainActivity:

@Override
protected void onDestroy() {
  super.onDestroy();

  mDbHelper.close();
}

У меня есть следующий журнал ошибок от моего пользователя:

device_model:bravo
build_version:1.6.17
condition:1
processName:spb.bridges
pid:23493
uid:10057
tag:null
shortMsg:android.database.sqlite.SQLiteException
longMsg:android.database.sqlite.SQLiteException: unable to close due to unfinalised statements
stackTrace:java.lang.RuntimeException: Unable to destroy activity {my.package/my.package.MainActivity}: android.database.sqlite.SQLiteException: unable to close due to unfinalised statements
at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:2680)
at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:2698)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:2814)
at android.app.ActivityThread.access$1600(ActivityThread.java:117)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3694)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.database.sqlite.SQLiteException: unable to close due to unfinalised statements
at android.database.sqlite.SQLiteDatabase.dbclose(Native Method)
at android.database.sqlite.SQLiteDatabase.onAllReferencesReleased(SQLiteDatabase.java:323)
at android.database.sqlite.SQLiteDatabase.close(SQLiteDatabase.java:884)
at android.database.sqlite.SQLiteOpenHelper.close(SQLiteOpenHelper.java:220)
at spb.bridges.DbAdapter.close(DbAdapter.java:177)
at spb.bridges.MainActivity.onDestroy(MainActivity.java:159)

Что не так с моим кодом?

Ответы [ 2 ]

1 голос
/ 23 июня 2011

Возможно, они пытаются закрыть приложение, пока приложение выполняет операцию с базой данных. Самое простое, что можно сделать, это поместить try / catch / log вокруг этого оператора mDbHelper.close();

0 голосов
/ 23 июня 2011

OnDestroy () не гарантированно запускается.Если, скажем, пользователь использует убийцу задач, он может sudo убить -9, и не запускаться.Другие люди на SO также говорили, что есть ситуации, когда даже Android не будет называть это.Он должен быть вызван прямо перед тем, как Android убьет его, чтобы освободить память.

Вероятно, было бы лучше, если бы вы закрыли эту логику в OnPause (), а затем снова инициализировали в OnResume ().

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