房间错误:不确定如何处理插入方法的返回类型

Posted

技术标签:

【中文标题】房间错误:不确定如何处理插入方法的返回类型【英文标题】:Room error: Not sure how to handle insert method's return type 【发布时间】:2019-11-20 06:48:27 【问题描述】:

我不明白,我虽然这是获取新插入行的 id 的方法。

DAO

@Dao
public interface AlarmDao 

    .....

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    long insertAll(AlarmEntity...alarms); //used long instead of void

实体

@Entity(tableName = "tb_alarm")
public class AlarmEntity 

    @PrimaryKey(autoGenerate = true)
    private long id;

    ...

    public long getId()
        return this.id;
    

但构建失败,我收到指向我的Dao 类的错误,错误是:

错误:不确定如何处理插入方法的返回类型。

我错过了什么?

【问题讨论】:

【参考方案1】:
AlarmEntity...alarms

这翻译成多个插入。所以返回类型应该是List<Long>或者long[],才有意义。如果您传递两个项目,您将获得两个 id,每个新插入的行一个。

如果您想一次只插入 1 项,请删除 varargs (...)。 EG

@Insert
long insert(AlarmEntity alarms);

【讨论】:

我忘记了三个点,尴尬。【参考方案2】:

如果有人在 2021 年 12 月遇到此问题,我刚刚解决了我的问题,它可能与您的问题相同。

事实上,kotlin 1.6.0 已经正式推出。但是,对于 Room 的稳定 2.3.0 版本,它不包含使用此更新的 kotlin 的依赖项。

我所做的是将我的房间更新为 2.4.0-rc01,这解决了我的问题!

【讨论】:

非常感谢。你救了我!你解决了我的问题。 我的荣幸,朋友 :) 你拯救了我的一天!【参考方案3】:

来自Accessing data using Room DAOs:

如果@Insert 方法只接收1 个参数,它可以返回一个long,即插入项的新rowId。如果参数是数组或集合,则应返回 long[] 或 List。

insertAll ()的返回类型改为long[]或List

【讨论】:

【参考方案4】:

按照文档说明,如果@Insert 方法只接收1 个参数,它可以返回一个long,这是插入项的新rowId。如果参数是数组或集合,则应返回long[]List<Long>。 在您的情况下,您有一个列表作为参数,您应该返回 long[]List<Long> 来源:https://developer.android.com/training/data-storage/room/accessing-data#java

【讨论】:

【参考方案5】:

在我的情况下,由于 vararg,我遇到了同样的错误。删除后,错误消失了。

错误

@Insert
suspend fun insert(vararg client: Client): Long

正确

@Insert
suspend fun insert(client: Client): Long

【讨论】:

【参考方案6】:

我没有上述问题,像这样的简单方法得到同样的错误

@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun upsert(user: User): Long

我通过将房间库更新到可用的最新版本来解决此问题。 就我而言,最新版本是 2.3.0,所以我改为:

implementation "androidx.room:room-runtime:2.3.0"
implementation "androidx.room:room-ktx:2.3.0"
kapt "androidx.room:room-compiler:2.3.0"

【讨论】:

【参考方案7】:

降级你的 build.gradle(project level) 依赖类路径

org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.0

org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.31

dependencies 
    classpath "com.android.tools.build:gradle:7.0.3"    
    // Downgrade in your scenario. It will be 1.6.0, please change this to 1.5.31.
    classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.31'   
    

【讨论】:

以上是关于房间错误:不确定如何处理插入方法的返回类型的主要内容,如果未能解决你的问题,请参考以下文章

如何解决错误:使用 RX java 在实现室中“不确定如何处理插入方法的返回类型”

Codeigniter:当我插入数据时出现重复键错误,我该如何处理这个错误?

Spring DBUnit 插入数据的时候如何处理自增ID

如何处理 Nswag 方法的 FileResponse 返回类型

JMeter - 如何处理Longpolling运输方法

Android 房间数据库 - 不确定如何将 Cursor 转换为此方法的返回类型