当前位置: 首页 > 知识库问答 >
问题:

返回单在@插入在Android房间不工作

白成济
2023-03-14

所以我需要从插入函数中取回插入项目的ID。包括来自Google的消息来源在内的多个消息来源都表示,可以通过作为@插入带注释DAO函数的返回值的单执行此操作。不幸的是,编译总是以以下方式退出:

xxx\CarDao。java:19:错误:不确定如何处理insert方法的返回类型。公共抽象java。lang.对象插入(@org.jetbrains.annotations.NotNull()

我试着改成也许

我的代码如下所示:

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)

}

我完全不知道是什么导致了这一切。那么,我做错了什么?如果这只是一个bug,那么在我的活动和这个活动数据的上下文中获取id的解决方法是什么?

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

共有1个答案

宋飞舟
2023-03-14

你在使用

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

它同时使用协同路由(挂起)和Rx(单个)。Room不允许您同时使用这两种技术(也没有任何意义,因为只有一种就足够了)-您需要选择您想要的异步技术。

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

suspend fun insert(car: Car): Long

或Rx:

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

 类似资料:
  • 我在Livedata上使用了Room和RxJava,但它不起作用<我试了两种方法。我不知道为什么第二个有效,为什么第一个无效。 (1)按单条获取列表- 道 ViewModel我使用了Repository模式(dao的返回类型和Repository的返回类型相同) 碎片 它在创建片段时工作,但数据在更改时不更新。 道 视图模型 碎片 当数据发生变化时,它工作得很好。 我期待你的建议。 请让我知道,如

  • 我在房间使用关系中添加了一对多关系。我引用这篇文章是为了编写以下房间关系代码。 这篇文章讲述了如何从数据库中读取值,但将实体存储到数据库中会导致用户ID为空,这意味着这两个表之间没有关系。 我不确定在具有用户ID值的情况下,将用户和宠物列表插入数据库的理想方法是什么。 1)用户实体: 2) 宠物实体: 3)用户带宠物POJO: 现在,为了从DB中获取记录,我们使用以下DAO: 编辑 我已创建此问题

  • 我用这个房间已经有一段时间了。我来自mysql的背景,您必须检查查询和其他内容的值。在room中,我发现这有点复杂,因为到目前为止,我可以将dao insert查询声明为void,或者只要返回rowId,如果返回long,我就必须编写一个侦听器来通知UI成功/失败。我的问题是,这是否必要?我是否需要insert/updates/deletes的返回值,或者这些查询是否保证成功?

  • 我有一个插入行的查询 我正在使用RxJava在后台线程上执行查询: 目前,它成功返回为插入的DAO新创建的主键。如何返回整个插入的行,而不使用新的行ID执行第二次查询? 在postgreql我会做这样的事情: 不知道如何使用房间图书馆

  • 我需要更新,如果不存在插入行到ROOM DB。 我这样做:

  • IIS可能会搞砸它?我倾向于认为IIS对于和)有不同的进程,因此,我在app.post上引用的套接字与我在()中加入用户是不同的。 在Azure/IIS中使用socket.io房间时有什么提示吗?谢了!