【问题标题】: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 类的错误,错误是:

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

我错过了什么?

【问题讨论】:

    标签: java android android-room


    【解决方案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'   
            }    
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2022-01-02
              • 1970-01-01
              • 2020-09-07
              • 2022-06-15
              • 2019-11-20
              • 2021-12-28
              • 2019-08-11
              • 2016-03-19
              相关资源
              最近更新 更多