2017-01-17 72 views
3

我有一個有趣的問題。我在Android上的AsyncTask中執行了SQLite更新(因爲在進行數據庫調用之前,我還必須執行大量的遠程調用)。代碼就像一個魅力,除非應用程序被推到後臺(例如,使用主頁按鈕)。該任務在後臺繼續成功工作,進行數據庫調用並返回1行更改,但數據從未真正將其發送到數據庫。沒有錯誤或例外。即使陌生人,日誌顯示一切正常工作 - 沒有例外,納達。 再次,當不推到背景這工作正常。Android SQLite更新不能在AsyncTask的後臺工作

召喚:

result = (sqlDB.update("FormInstance", values, "InstanceId=?", new String[] { String.valueOf(form.getSubmissionId()) }) > 0); 

還沒有與此有關的呼叫(除非它是Android的SQLite代碼的引擎蓋下發生)的交易。

任何人都知道爲什麼這可能是這種情況?數據庫連接或SQLLite發生什麼事,我不知道什麼時候推到後臺?

UPDATE

我試圖用的BeginTransaction包裹DB呼叫/ endtrans沒有任何成功:

sqlDB.beginTransaction(); 
    try { 
     result = (sqlDB.update("FormInstance", values, "InstanceId=?", new String[] { String.valueOf(form.getSubmissionId()) }) > 0); 
    } 
    finally { 
     sqlDB.endTransaction(); 
    } 

仍然充當好像它是成功的,但絕不數據committed.Please注意,我從設備中拉出數據庫並確認它沒有被更新。

+0

聽起來像您的交易沒有在查詢結束時提交。您是否嘗試過自己編譯查詢並在事務塊之間執行? – droidpl

+0

@droidpl Sry-沒有涉及的交易。 –

+0

每次您在數據庫中執行某項操作時,都會創建一個事務,儘管更新調用會在幕後進行。你可以用隱式事務來調試,以調試正在發生的事情嗎? – droidpl

回答

0

經過多次測試後,我發現雖然偶爾更新數據的onPause方法有問題,但真正的問題是執行更新時SQLLite更新並未真正更新一列(FormStatus)。這只是在後臺運行時的情況。我通過在更新後立即查詢結果來驗證這一點。最終的解決方案是隻更新FormStatus列的輔助更新,該列確實有效。用begintrans/endtrans包裝並沒有幫助。