在 Android 房间的 @Insert 上返回 Single<Long> 无效

Returning Single<Long> on @Insert in Android Room doesn't work

所以我需要从插入函数中获取插入项的 ID。包括来自 Google 的 this one 在内的多个来源表示,可以通过 Single as return @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 和此活动数据的上下文中获取 ID 的解决方法是什么?

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

您正在使用

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

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

因此您可以使用协程:

suspend fun insert(car: Car): Long

或接收:

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