2012-06-15 16 views
5

Ho un oggetto helper del database. È importante che lo chiuda quando lascia l'attività, quindi lo faccio. Tuttavia, tornando all'attività, ricevo un avviso sull'interrogazione di un database che è già stato chiuso. La query funziona davvero, ma c'è ancora qualcosa di chiaramente sbagliato.Android: Eccezione di stato illegale del database SqLite (database già chiuso)

La mia comprensione del ciclo di vita delle attività Android non è forte, ma suppongo di dover riaprire il database in onResume(). Non è corretto?

Ecco onResume():

@Override 
protected void onResume() { 

super.onResume(); 

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

Ecco dbHelper.openDataBase();

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

Ecco il mio 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

necessità DBHelper codice del file .. ..... –

+0

il tuo 'dbHelper.openDataBase()' ??? – GAMA

+0

prova 'db = dbHelper.getWritableDatabase();' ... dove 'db' è l'oggetto SQLiteDatabase. – GAMA

risposta

2

Hai bisogno di istanziare la classe DBHelper in onResume ... che troppo (potrebbe) vengono distrutte quando si va lontano dalla attività.

dbHelper = new YourDatabaseHelper(); 

In realtà, dal momento che onResume viene chiamato anche su un nuovo inizio, si potrebbe spostare tutto il codice lì (e quindi evitare istanziare si Helper (e fare altre cose) due volte.

+0

Barak, hai perfettamente ragione. esattamente il mio problema: stavo facendo tutto il doppio, in onCreate() e onResume(). Grazie. – rustyWhitefeather

Problemi correlati