5

データベース ヘルパー オブジェクトがあります。アクティビティを終了するときに閉じることが重要なので、閉じます。ただし、アクティビティに戻ると、既に閉じられているデータベースのクエリに関する警告が表示されます。クエリは実際に機能しますが、明らかに間違っていることがあります。

Android アクティビティのライフ サイクルについての私の理解は十分ではありませんが、onResume() でデータベースを再度開く必要があると思います。これは正しくありませんか?

onResume() は次のとおりです。

@Override
protected void onResume() {

super.onResume();

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

これが dbHelper.openDataBase(); です。

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

これが私の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)    
4

1 に答える 1

2

dbhelper クラスをインスタンス化する必要がありますonResume... アクティビティから離れると、これも (おそらく) 破棄されます。

dbHelper = new YourDatabaseHelper();

実際にonResumeは、新しい開始時にも呼び出されるため、すべてのコードをそこに移動できます (したがって、ヘルパーのインスタンス化 (および他のことの実行) を 2 回回避できます)。

于 2012-06-15T13:19:33.407 に答える