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

带返回值(long或int)的Android Room DAO@Insert是如何工作的?,android,android-room,dao,android-mvvm,Android,Android Room,Dao,Android Mvvm,最近我在学用刀。据我所知,所有的@Insert、@Update或@Query都是异步执行的。从纪录片中,@Insert可以返回一个long值,该值是插入项目的新rowId(如果有多个项目,则返回List)。假设我的刀是这样的: @Insert long insertTransaction(Transaction transaction); @Insert List<Long> insertTransactions(List<Transaction> transactio

最近我在学用刀。据我所知,所有的
@Insert
@Update
@Query
都是异步执行的。从纪录片中,
@Insert
可以返回一个
long
值,该值是插入项目的新
rowId
(如果有多个项目,则返回
List
)。假设我的刀是这样的:

@Insert
long insertTransaction(Transaction transaction);

@Insert
List<Long> insertTransactions(List<Transaction> transactions);
@Insert
长插入事务(事务处理);
@插入
列表插入事务(列表事务);
当我在活动或片段中使用这些方法时,这是否意味着我在异步任务完成后获得long值?

<!-- 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)

//如果插入未完成,是否得到0
//或者它将等待插入完成并返回较长时间?
长id=viewModel.insertTransaction(事务)
如果它等待异步任务完成,是否会阻塞主线程(特别是在插入大型列表时)?如果没有,如何检查插入是否完成

据我所知,所有@Insert、@Update或@Query都是异步执行的

默认情况下,所有@Insert、@Update或@Query都是同步执行的。Room警告您这一点,并且在RoomDatabase.Builder中没有显式使用方法的情况下,您无法执行同步调用

当然,不建议使用同步调用。要使用异步调用,您有几个选项(请参阅):

  • Kotlin协同程序(
    suspend
    关键字)
  • RxJava(将返回类型设置为
    单个
    可能
    可完成
  • 番石榴(将返回类型设置为
    ListenableFuture
此外,您可以使用线程/线程池将DB操作显式地移动到后台线程,并自行管理异步工作(例如使用回调)


使用上面的一个选项,异步任务结束时会通知您(通知的方法取决于您选择的框架)。否则,您将进行同步调用并阻止UI线程。

您还可以使用LiveData编写异步可观察查询