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

33

我不明白,我以为这是获取新插入行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类,错误是:

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

我错过了什么?

8个回答

32
AlarmEntity...alarms

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

如果您只想一次插入一个项目,请删除varargs...)。例如:

@Insert
long insert(AlarmEntity alarms);

2
我忘记了那三个点,真尴尬。 - Polar

30
如果有人在2021年12月遇到这个问题,我刚刚解决了我的问题,也可能和你的问题一样。目前kotlin 1.6.0已经正式发布,但是在Room稳定版本2.3.0中,没有包括与此更新的kotlin进行兼容所需的依赖项。我所做的就是将我的Room升级到2.4.0-rc01,问题得以解决!

1
非常感谢你,你救了我!你解决了我的问题。 - Nader
没问题,朋友 :) - Hamid Ebadi
你救了我的一天! - akozin
1
如果每个人在Kotlin 1.7上遇到类似的问题,只需升级到Room 2.4.3:https://developer.android.com/jetpack/androidx/releases/room#version_243_3 - Anigif
非常感谢,我的这个错误自从两天前就一直没有解决。 - Adarsh Dhakad

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

错误的

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

正确

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

4

我没有以上提到的问题,但是在像这样的简单方法中仍然遇到同样的错误

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

我通过更新最新版本的room库来解决了这个问题。在我的情况下,最新版本是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"

4
使用Room DAO访问数据

如果@Insert方法仅接收一个参数,则可以返回一个长整型,该长整型是插入的新行ID。如果参数是数组或集合,则应返回long[]或List。

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

4

2
将您的build.gradle(项目级别)依赖项classpath中的
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'   
}    

1
为什么?提及这个降级背后的原因会很好。 - Hossein Farrokhi

-1
对于我的情况,我只是将Kotlin插件版本从1.7.10降级到了1.6.20,你应该尝试降级或升级你的版本(不像我的版本),但是你应该能看到它应该可以工作。

来自:
plugins {
    id 'org.jetbrains.kotlin.android' version '1.7.10' apply false
}

到:

plugins {
    id 'org.jetbrains.kotlin.android' version '1.6.20' apply false
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接