【问题标题】:How does Android Room DAO @Insert with return value(long or int) work?带有返回值(long 或 int)的 Android Room DAO @Insert 如何工作?
【发布时间】:2020-12-15 21:55:06
【问题描述】:

最近我正在学习使用 DAO。据我了解,所有@Insert@Update@Query 都是异步执行的。而从纪录片中,@Insert 可以返回一个long 值,这是插入项目的新rowId(如果是多个项目,则为List<long>)。假设我的 DAO 看起来像这样:

@Insert
long insertTransaction(Transaction transaction);

@Insert
List<Long> insertTransactions(List<Transaction> transactions);

当我在 Activity 或 Fragment 中使用这些方法时,是否意味着我在异步任务完成后获得了 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)

如果它等待异步任务完成,会不会阻塞主线程(尤其是在插入大列表时)?如果没有,如何检查插入是否完成?

【问题讨论】:

    标签: android android-room dao android-mvvm


    【解决方案1】:

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

    默认情况下,所有@Insert、@Update 或@Query 都是同步执行的。 Room 会对此发出警告,如果没有在 RoomDatabase.Builder 中显式使用方法 allowMainThreadQueries,您将无法进行同步调用。

    当然,不推荐使用同步调用。要使用异步调用,您有多种选择(查看 official documentation):

    • Kotlin 协程(suspend 关键字)
    • RxJava(将返回类型设置为SingleMaybeCompletable
    • Guava(将返回类型设置为ListenableFuture)。

    此外,您可以使用 Threads/ThreadPools 将 DB 操作显式移至后台线程,并自行管理异步工作(例如,使用回调)。

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2018-08-25
    相关资源
    最近更新 更多