2013-12-17 47 views
0

Heloou,我嘗試做一個嵌套事務,但扔SqliteDatabaseLockedException,而我不知道爲什麼...的Android,嵌套事務無法正常工作

數據源open()方法分配一個可寫數據庫各自屬性,以稍後調用方法來操作數據。他們都使用SQLHelpder來返回一個可寫數據庫。

@Override 
     protected Boolean doInBackground(String... url) { 

      try { 
       clientDataSource.open(); 
       movementDataSource.open(); 

       clientDataSource.getDatabase().beginTransaction(); 
       movementDataSource.getDatabase().beginTransaction(); 

       if(sendMovements()) { 
        movementDataSource.getDatabase().setTransactionSuccessful(); 
        clientDataSource.deleteAllClients(); 
       } 
       updateDatabase(url[0]); 
       clientDataSource.getDatabase().setTransactionSuccessful(); 
      } catch (JSONException e) { 
       //Treat Json Exception 
      } catch (IOException e) { 
       //Treat IOException 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      }finally { 
       movementDataSource.getDatabase().endTransaction(); 
       clientDataSource.getDatabase().endTransaction(); 
      } 

      return true; 
     } 
+0

whats裏面的updateDatabase方法? – Techfist

+0

我從服務器檢索數據並插入新的客戶端到db –

+0

哪個db movementDataSource? – Techfist

回答

0

嗯,這是形成sqlite的文檔,這裏是它說什麼

開始以EXCLUSIVE模式交易。

事務可以嵌套。當外部事務結束時,在該事務中完成的所有工作和所有嵌套事務將被提交或回滾。如果任何事務沒有被標記爲乾淨(通過調用setTransactionSuccessful),則更改將被回滾。否則他們會承諾。

這裏是交易的標準成語:

db.beginTransaction(); 
    try { 
    ... 
    db.setTransactionSuccessful(); 
    } finally { 
    db.endTransaction(); 
    } 

所以關鍵是,除非你調用它成功的,它會導致數據庫鎖定錯誤後標記您的交易結束,並最終這是你在做什麼。

movementDataSource.getDatabase()。setTransactionSuccessful(); //在你調用這個之後,結束這個事務,否則會導致數據庫鎖定錯誤。

+0

我試圖結束其他事務,仍然給我鎖記錄 –

+0

只是爲了記錄,沒有交易的方法,它工作正常 –

相關問題