2011-05-27 30 views
1

我將在前面提到這個問題,注意我已經看過this similar question,但是我仍然遇到問題。基本上,我想在我的Android應用程序的兩個活動中訪問同一個數據庫。然而,當我在第二個活動打開它,我得到兩個系列的消息在我的logcat:在沒有內存泄漏的情況下在Android中的連續活動中使用相同的數據庫

第一:

「的終結拋出未捕獲的異常(將被丟棄):
Ljava /郎/ IllegalStateException異常;:結束寫入光標[email protected]上還沒有被去激活或在android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596)關閉

(狗是在我的數據庫表的名稱,dog_data)

二:

「ERROR /數據庫(1316):泄漏發現
ERROR /數據庫(1316):java.lang.IllegalStateException:/數據/數據/ COM ... /數據庫/ dog_data SQLiteDatabase創建和從未關閉」

至於我可以告訴大家,我上午在退出的第一個活動結束我的數據庫。遵循記事本教程的風格,我在SQLiteDatabase和第一個活動的onPause()方法中有一個包裝類「DbAdapter」,我調用該Adapter上的close方法(它調用SQLiteDatabase上的close方法,以及我的SQLiteOpenHelper)。

我認爲這個問題是我如何我試圖重新打開數據庫在我的第二個活動:

SQLiteDatabase db = openOrCreateDatabase("dog_data", 
    SQLiteDatabase.CREATE_IF_NECESSARY, null); 

(我選擇不使用包裝,因爲我只需要在數據庫上運行一個查詢,也許這是一個問題)。

有人可以提出我的問題可能在哪裏?我承認(從我的問題中可以清楚)我沒有完全理解「關閉」數據庫的含義(SQLiteDatabase.close()的文檔並不特別具體),這可能是主要原因我的問題。

謝謝。

+0

事實上,事實證明,我在打開和關閉數據庫時有點過於熱情。通過從onResume()和DbAdapter.open()從onResume()中刪除DbAdapter.close(),我能夠停止內存泄漏。 我仍然得到第一個「終結光標」問題,雖然它在LogCat中是綠色字體,似乎表明它不是一個大錯誤。如果可能的話,我仍然想解決它。預先感謝您的幫助。 – 2011-05-27 17:00:47

回答

1

爲防萬一有人碰巧遇到類似的問題(似乎可能但可能不太可能),我最近偶然發現了這個解決方案。在我的「DbAdapter」的插入方法中,我(愚蠢)通過查詢具有某個字段的給定值的行的查詢來檢查唯一性,並查看該查詢是否返回任何行。這是創建一個遊標,我沒有關閉,導致上面提到的「完成遊標」錯誤。

0

我以前收到過這個錯誤,不得不使用cursor.close()來解決這個問題。我不確定爲什麼,因爲有些時候我沒有使用close()並且沒有收到任何錯誤。也許這是一個警告,只有當它坐在旁邊的節目停止錯誤時纔會被注意到?

我會說正確的程序是打開數據庫連接 - >通過運行數據庫方法創建遊標 - >通過遊標迭代 - >關閉遊標 - >關閉數據庫連接。

+0

感謝您的幫助。正如我在上面的評論中指出的,我能夠修復內存泄漏。光標問題對我來說仍然沒有解決,但據我所知,這並不是特別重要,所以我繼續前進。我早些時候關閉了遊標,並且我還嘗試在我創建的每個遊標上調用startManagingCursor() - 在停止最終化遊標illegalstateexception時沒有運氣。 – 2011-05-31 23:13:56

相關問題