房间错误:不确定如何处理插入方法的返回类型
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:当我插入数据时出现重复键错误,我该如何处理这个错误?