2012-06-15 22 views
5

Tengo un objeto auxiliar de base de datos. Es importante que lo cierre cuando salga de la actividad, así que lo hago. Sin embargo, al regresar a la actividad recibo una advertencia acerca de consultar una base de datos que ya se ha cerrado. La consulta realmente funciona, pero todavía hay algo obviamente mal.Android: excepción de estado ilegal de base de datos SqLite (base de datos ya cerrada)

Mi comprensión del ciclo de vida de la actividad de Android no es sólida, pero supongo que necesito volver a abrir la base de datos en onResume(). ¿Esto no es correcto?

Aquí es onResume():

@Override 
protected void onResume() { 

super.onResume(); 

    dbHelper.setInteger(playerID);   
    dbHelper.openDataBase(); 
    ourCursor = dbHelper.getPlayerSavedQuestions();   
    startManagingCursor(ourCursor); 
    adapter = new MyCustomAdapter(ourCursor); 
    myListView.setAdapter(adapter); 
} 

Aquí es dbHelper.openDataBase();

public void openDataBase() throws SQLException { 
    String myPath = DATABASE_PATH + DATABASE_NAME; 
    dbSqlite = SQLiteDatabase.openDatabase(myPath, null, 
      SQLiteDatabase.OPEN_READWRITE);  
} 

Aquí es mi Logcat:

06-15 13:51:32.388: W/SQLiteCursor(26750): requery() failed database /data/data/com.boboshi.exquizit.eng/databases/exquizit_custom.mp3 (conn# 0) already closed 
06-15 13:51:32.388: W/SQLiteCursor(26750): java.lang.IllegalStateException: database /data/data/com.boboshi.exquizit.eng/databases/exquizit_custom.mp3 (conn# 0) already closed 
06-15 13:51:32.388: W/SQLiteCursor(26750): at android.database.sqlite.SQLiteDatabase.verifyDbIsOpen(SQLiteDatabase.java:2082) 
06-15 13:51:32.388: W/SQLiteCursor(26750): at android.database.sqlite.SQLiteDatabase.getDbConnection(SQLiteDatabase.java:2407) 
06-15 13:51:32.388: W/SQLiteCursor(26750): at android.database.sqlite.SQLiteDatabase.getDatabaseHandle(SQLiteDatabase.java:2388) 
06-15 13:51:32.388: W/SQLiteCursor(26750): at android.database.sqlite.SQLiteCursor.requery(SQLiteCursor.java:246) 
06-15 13:51:32.388: W/SQLiteCursor(26750): at android.app.Activity.performRestart(Activity.java:4505) 
06-15 13:51:32.388: W/SQLiteCursor(26750): at android.app.Activity.performResume(Activity.java:4531) 
06-15 13:51:32.388: W/SQLiteCursor(26750): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2434) 
06-15 13:51:32.388: W/SQLiteCursor(26750): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2472) 
06-15 13:51:32.388: W/SQLiteCursor(26750): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1173) 
06-15 13:51:32.388: W/SQLiteCursor(26750): at android.os.Handler.dispatchMessage(Handler.java:99) 
06-15 13:51:32.388: W/SQLiteCursor(26750): at android.os.Looper.loop(Looper.java:137) 
06-15 13:51:32.388: W/SQLiteCursor(26750): at android.app.ActivityThread.main(ActivityThread.java:4424) 
06-15 13:51:32.388: W/SQLiteCursor(26750): at java.lang.reflect.Method.invokeNative(Native Method) 
06-15 13:51:32.388: W/SQLiteCursor(26750): at java.lang.reflect.Method.invoke(Method.java:511) 
06-15 13:51:32.388: W/SQLiteCursor(26750): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
06-15 13:51:32.388: W/SQLiteCursor(26750): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
06-15 13:51:32.388: W/SQLiteCursor(26750): at dalvik.system.NativeStart.main(Native Method)  
+1

necesidad dbHelper código de archivo .. ..... –

+0

su 'dbHelper.openDataBase()' ??? – GAMA

+0

intente 'db = dbHelper.getWritableDatabase();' ... donde 'db' es el objeto SQLiteDatabase. – GAMA

Respuesta

2

Es necesario crear una instancia de la clase dbhelper en onResume ... eso también (podría posiblemente) se destruyen cuando se va lejos de la actividad.

dbHelper = new YourDatabaseHelper(); 

En realidad, ya onResume se llama incluso en un nuevo comienzo, que podría mover todo el código allí (y por lo tanto evitar crear instancias que helper (y haciendo otras cosas) dos veces.

+0

Barak, tiene toda la razón. Eso fue exactamente mi problema: estaba haciendo todo dos veces, en onCreate() y onResume(). Gracias. – rustyWhitefeather

Cuestiones relacionadas