2014-11-04 103 views
1

據我所知,調用SqliteOpendHelper.getWritableDatabase()總是返回相同的實例SQLiteDatabase。那麼與之相關的交易也不會受到影響?確實getWritableDatabase()影響交易

假設一個單線程環境,我使用一個單例SQLiteOpenHelper實例。假設我有很長的交易:

  • 我打電話給SQLiteDatabase.beginTransaction()一次。
  • DAO1構造函數調用SqliteOpendHelper.getWritableDatabase()
  • DAO1方法對其執行CRUD操作。
  • DAO2構造函數調用SqliteOpendHelper.getWritableDatabase()
  • DAO2方法對其執行CRUD操作。
  • ... on and on
  • 我打電話給SQLiteDatabase.endTransaction()一次。

是否所有的DAO操作都在該單一事務中執行?如果多次調用getWritableDatabase()以某種方式實現交易,我無法從source中找到答案。

+1

我已經嘗試過使用單例方法,並且看到它不能以這種方式工作,如果您使用內容提供程序而不是DAO。即使爲SQLiteOpenHelper維護單例實例,並且通過contentprovider調用獲得相同的SQLiteDatabse實例,也不會像我們預期的那樣工作。交易必須在每個內容提供者調用中關閉。 – Aun 2014-11-04 07:25:06

+0

@Aun很有趣。 YOu是否意味着如果你不在'ContentProvider'中結束它,事務就不會被提交? – faizal 2014-11-04 07:46:36

+0

我已經調用API來提交事務。它不這樣工作。 所有進一步的CRUD呼叫都將被阻止。 – Aun 2014-11-04 07:50:26

回答

1

是; getWritableDatabase()始終返回相同的連接對象(除非先前已關閉),並且單個數據庫連接始終使用單個事務,因此通過它完成的所有操作都在同一個事務中。

請注意,SQLiteDatabase支持事務調用的嵌套,因此低層CRUD操作可以安全地執行自己的事務,而不管它們被調用的位置。