Что такое ошибка «SQLiteDatabase создан и никогда не закрыт»? - PullRequest
3 голосов
/ 03 октября 2011

Я закрыл базу данных в своем классе адаптера, поэтому, когда эта ошибка отображается в logcat, но мое приложение не закрывается принудительно, а отображается только ошибка в журнале cat ... где я должен закрыть базу данных, чтобы игнорировать эту ошибку ...

мои ошибки ... ниже ... в каком классе я ушел для закрытия базы данных ..... я получил помощь по этой ссылке http://www.vogella.de/articles/AndroidSQLite/article.html

ERROR/Database(265): Leak found
      ERROR/Database(265): java.lang.IllegalStateException: /data/data/expenceanywhere.mobile/databases/data SQLiteDatabase created and never closed
      ERROR/Database(265):     at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1581)
      ERROR/Database(265):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:638)
      ERROR/Database(265):     at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:659)
      ERROR/Database(265):     at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:652)
      ERROR/Database(265):     at android.app.ApplicationContext.openOrCreateDatabase(ApplicationContext.java:482)
       ERROR/Database(265):     at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:193)
       ERROR/Database(265):     at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)
        ERROR/Database(265):     at expenceanywhere.mobile.NotesDbAdapter.open(NotesDbAdapter.java:56)
        ERROR/Database(265):     at expenceanywhere.mobile.AddEditExpense.onCreate(AddEditExpense.java:199)
        ERROR/Database(265):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
        ERROR/Database(265):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
       ERROR/Database(265):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
       ERROR/Database(265):     at android.app.ActivityThread.access$2100(ActivityThread.java:116)
         ERROR/Database(265):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
         ERROR/Database(265):     at android.os.Handler.dispatchMessage(Handler.java:99)
         ERROR/Database(265):     at android.os.Looper.loop(Looper.java:123)
         ERROR/Database(265):     at android.app.ActivityThread.main(ActivityThread.java:4203)
       ERROR/Database(265):     at java.lang.reflect.Method.invokeNative(Native Method)
       ERROR/Database(265):     at java.lang.reflect.Method.invoke(Method.java:521)
       ERROR/Database(265):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
         ERROR/Database(265):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
          ERROR/Database(265):     at dalvik.system.NativeStart.main(Native Method)

Ответы [ 5 ]

2 голосов
/ 03 октября 2011

Не забывайте всегда закрывать БД в классе Хелпер

//---closes the database---    
public void close() 
{
    DBHelper.close();
}

Аналогичный вопрос: Sqlite Database LEAK FOUND исключение в Android?

1 голос
/ 10 декабря 2011

Подтверждаю проблему с утечкой в ​​коде от Voggella.В моем случае сработало переопределение метода OnDestroy с помощью оператора close, как предлагали другие.Я думаю, вы можете добавить этот код в свой AddEditExpense.java.

 @Override  
 protected void onDestroy() {
   super.onDestroy();
   dbHelper.close();
 }
1 голос
/ 03 октября 2011

Вам необходимо закрыть любой открытый объект базы данных, вызвав метод close().

1 голос
/ 03 октября 2011

Вы должны закрыть базу данных перед выходом из приложения или выходом из класса.

db.close()
0 голосов
/ 29 ноября 2011

У меня была такая же проблема в одном из моих приложений. Я открывал и закрывал базу данных каждый раз, когда получал к ней доступ. Но я все еще получил ошибку. Я полагаю, что при таком подходе разные потоки, которые обращаются к общему объекту, портят состояние базы данных.

Чтобы преодолеть это, я поместил экземпляр базы данных в основное действие и поделился им со всеми другими действиями. в методе OnCreate() основного действия создается экземпляр db. Мне пришлось переопределить методы onResume() и onPause(), которые я закрыл базу данных (в пределах onPause()) и открыл (в пределах onResume()) основного действия.

Я не уверен, что это правильный способ избавиться от проблемы, но до сих пор это работало для меня.

...