在 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>
所以我需要从插入函数中获取插入项的 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> 等,但始终是相同的错误。
我的代码如下所示:
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>