带返回值(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
使用上面的一个选项,异步任务结束时会通知您(通知的方法取决于您选择的框架)。否则,您将进行同步调用并阻止UI线程。您还可以使用LiveData编写异步可观察查询