簡體   English   中英

帶有返回值(long 或 int)的 Android Room DAO @Insert 如何工作?

[英]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 ,您將無法進行同步調用。

當然,不推薦使用同步調用。 要使用異步調用,您有幾個選項(查看官方文檔):

  • Kotlin 協程( suspend關鍵字)
  • RxJava(將返回類型設置為SingleMaybeCompletable
  • Guava(將返回類型設置為ListenableFuture )。

此外,您可以使用 Threads/ThreadPools 將 DB 操作顯式移動到后台線程,並自行管理異步工作(例如,使用回調)。

使用上述選項之一,您將在異步任務結束時收到通知(通知的方法取決於您選擇的框架)。 否則,您會進行同步調用並阻止 UI 線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM