2010-06-13 140 views
0

This Android application on Google使用下面的方法用備份替換數據庫文件後刷新數據庫:重置或刷新數據庫連接

public void resetDbConnection() { 
    this.cleanup(); 
    this.db = 
     SQLiteDatabase.openDatabase(
      "/data/data/com.totsp.bookworm/databases/bookworm.db", 
      null, SQLiteDatabase.OPEN_READWRITE); 
} 

我沒有建立這個應用程序,我不知道會發生什麼。 我想讓這個想法在我自己的應用程序中工作,但數據似乎被視圖緩存,並且即使在我調用cleanup()並重新打開數據庫之後,應用程序仍然顯示被替換的數據庫中的數據。我必須終止並重新啓動活動才能看到新數據。

我試圖在我的TabHost視圖上調用無效,這幾乎包含了所有內容。我認爲這些觀點會重新繪製和刷新其基礎數據,但這也沒有預期的結果。

我最終以編程方式重新開始了活動,這很有效,但這似乎是一個很大的措施。有沒有更好的辦法?

+0

也許你必須重新查詢你的遊標和/或notifiydataset的變化。 – Pentium10 2010-06-13 19:29:44

回答

1

至少在概念上同意Pentium10。

該應用程序正在使用Cursor來顯示其數據。 Android中的Cursor類似於ODBC中的客戶端遊標,因爲它是查詢結果集所代表的所有數據的緩存副本。

現在,處理數據庫內容變化的正常方式是在Cursor上調用requery()。這將通過CursorAdapter連接ListViews或其他AdapterViews波及其變化。

在你的情況下,我不完全肯定會工作,因爲你正在關閉,替換和重新打開數據庫。這不應該在數據AFAIK上打開Cursor來完成。因此,對於您的情況,您需要關閉Cursor,執行數據庫洗牌,然後再次運行查詢以在您的新數據庫上獲得新的Cursor

+0

這似乎是不切實際的,因爲我有一個TabHost具有多個標籤,每個標籤都有自己的光標打開。我甚至不知道如何通知每個Tab的光標來執行一個請求()。實際上似乎發生的事情是遊標在檢測到更改時會刷新自己。例如,當我向一個ListView發起一個事件,導致嘗試更新數據庫中不再存在的行時,遊標將刷新,並且ListView顯示正確的數據。我並不是說這就是我希望它的行爲,我只是將其作爲一種觀察。 – cdonner 2010-06-14 00:04:58

+0

@cdonner:「實際上似乎發生的事情是遊標在檢測到變化時會刷新自己。」如果他們是託管遊標,那是非常可能的。他們很樂意將他們的數據庫從他們下面剝離出來。也許你只能在應用程序啓動的時候才能恢復你的數據庫,或者在你知道你沒有打開數據庫連接的時候。 – CommonsWare 2010-06-14 00:18:10

+0

當然,等待用戶對數據做些什麼,然後向他展示其他東西是不可接受的。我會讓我的代碼完成活動並重新啓動它,因爲它確保所有內容都能夠正確地重新初始化。 – cdonner 2010-06-14 01:27:28