【问题标题】:Returning Single<Long> on @Insert in Android Room doesn't work在 Android Room 中的 @Insert 上返回 Single<Long> 不起作用
【发布时间】:2020-03-08 21:41:21
【问题描述】:

所以我需要从插入函数中获取插入项的 ID。包括来自 Google 的 this one 在内的多个消息来源说,可以通过 Single 作为 @Insert 带注释的 DAO 函数的返回值来执行此操作。 不幸的是,编译总是退出:

xxx\CarDao.java:19: error: Not sure how to handle insert method's return type. public abstract java.lang.Object insert(@org.jetbrains.annotations.NotNull()

我尝试将其更改为 Maybe、Single> 等,但总是同样的错误。

我的代码如下所示:

import androidx.lifecycle.LiveData
import androidx.room.*
import io.reactivex.Single


@Dao
interface CarDao {
    @Query("SELECT * FROM cars")
    fun getAll(): LiveData<List<Car>>

    @Query("SELECT * FROM cars WHERE uid = :uid")
    fun getById(uid: Int): Single<List<Car>>

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insert(car: Car): Single<Long>>

    @Query("DELETE FROM cars WHERE uid = :uid")
    suspend fun deleteById(uid: Int)

}

我完全不知道是什么原因造成的。那么我做错了什么,如果它只是一个错误,那么在我的 Activity 和此 Activity 数据的上下文中获取 id 的解决方法是什么?

更新: 找到了一个非常奇怪的解决方案:当我删除 suspend 关键字时,它编译没有任何问题。然后问题变成无法从主线程访问数据库。 为什么不挂起就可以,挂起就不行?

【问题讨论】:

  • 您使用的是哪个版本的 Room?
  • 它的版本是 2.2.4

标签: android sqlite rx-java2 android-room


【解决方案1】:

你正在使用

suspend fun insert(car: Car): Single<Long>

同时使用协程 (suspend) 和 Rx (Single)。 Room 不允许您同时使用这两种技术(也没有任何意义,因为只需其中一种就足够了)- 您需要选择您想要的异步技术。

因此,您可以将协程用于:

suspend fun insert(car: Car): Long

或接收:

fun insert(car: Car): Single<Long>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多