2013-07-11 54 views
0

當新的sqlite添加到SD卡上的特定目錄時,我遇到了使用FileObserver更新元數據庫的問題。如果我手動adb推新的sqlite到目錄,然後撥打onEvent(FileObserver.CREATE, <filename>),它完美的作品。然而,當我呼籲FileObserver.startWatching()和adb推觀察員的新sqlite自己捕獲,它調用onEvent(與我手動調用它相同的參數 - 我檢查),打開sqlite文件罰款,但無法找到當我查詢新打開的sqlite並引發sqlite異常時,它的任何表。Android FileObserver找到SQLite,但找不到它們的表/內容

我使用的SQLiteDatabase的openDatabase()方法,所以它不是無法找到原來的和創建一個空的(一個共同的問題)。另外,在adb shell中進行的相同的sqlite查詢訪問新添加的sqlite的表格也很好。

有沒有人有任何想法,爲什麼會發生這種情況?基於手動調用的成功,我的代碼看起來工作正常,所以我正在尋找任何帶有FileObservers或Android上的SQLite的怪癖,我可能已經錯過了,因爲我對這兩者都是新手。

UPDATE:進一步調試表明,如果我亞行推動一個文件,並手動調用onEvent(FileObserver.CREATE, <filename>),然後啓動FileObserver觀看和亞行推動同一個文件到同一位置,在FileObserver執行這些onEvent查詢,沒有麻煩定位表。 ..不知道這是什麼意思。

回答

0

我想出了這個問題 - 對於文件創建事件,Android的FileObserver的方法onEvent,在創建文件後立即執行,而不是等待文件完成寫入。我遇到了競爭條件,其中onEvent方法試圖在文件實際完成寫入之前查詢數據庫。當我adb推送,然後手動調用onEvent時,文件有足夠的時間寫入,這就是爲什麼它能夠工作。

快速修復是我給onEvent調用參數FileObserver.CLOSE_WRITE而不是CREATE的查詢。由於我正在對這些數據庫進行只讀訪問,因此他們唯一一次寫入是第一次,並且CLOSE_WRITE事件在它們完成並準備好被查詢之前不會被觸發。