[英]How does Android Room DAO @Insert with return value(long or int) work?
最近在學習使用DAO。 據我了解,所有@Insert
、 @Update
或@Query
都是異步執行的。 並且從紀錄片中, @Insert
可以返回一個long
值,即插入項的新rowId
(或List<long>
,如果有多個項)。 假設我的 DAO 看起來像這樣:
@Insert
long insertTransaction(Transaction transaction);
@Insert
List<Long> insertTransactions(List<Transaction> transactions);
當我在活動或片段中使用這些方法時,是否意味着我在異步任務完成后獲得了長值?
<!-- language: lang-none -->
// Do I get 0 if the insert is not complete
// or it will wait till the insert is complete and return long?
long id = viewModel.insertTransaction(transaction)
如果它等待異步任務完成,它不會阻塞主線程(尤其是在插入大列表時)? 如果沒有,我如何檢查插入是否完成?
據我了解,所有@Insert、@Update 或@Query 都是異步執行的。
默認情況下,所有@Insert、@Update 或@Query 都是同步執行的。 Room 會對此發出警告,如果沒有在 RoomDatabase.Builder 中顯式使用方法allowMainThreadQueries ,您將無法進行同步調用。
當然,不推薦使用同步調用。 要使用異步調用,您有幾個選項(查看官方文檔):
suspend
關鍵字)Single
、 Maybe
、 Completable
)ListenableFuture
)。此外,您可以使用 Threads/ThreadPools 將 DB 操作顯式移動到后台線程,並自行管理異步工作(例如,使用回調)。
使用上述選項之一,您將在異步任務結束時收到通知(通知的方法取決於您選擇的框架)。 否則,您會進行同步調用並阻止 UI 線程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.