Kotlin/Room错误:指定为非空的参数为空:方法kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull,参数消息。

3

不确定是什么原因导致的,但我正试图从API请求数据,其中包含一个Message对象数组。如果我将结果打印到控制台,那么当我期望Message为一组对象时,除了Messages=null之外,数据是正确的。我不明白我漏掉了什么?

我得到了这个错误:java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter messages

有人可以指点一下我吗?下面是该类的代码:

const val PROFILE_RESPONSE_ID = 0

@Entity(tableName = "profile")
data class ProfileResponse(
    val id: Int,
    val name: String,
    val code: String,
    val title: String,
    @SerializedName("profile_image")
    val profileImage: String,
    @SerializedName("background_image")
    val backgroundImage: String,
    @Embedded(prefix = "messages_")
    val messages: ArrayList<Messages>,
) {
    @PrimaryKey(autoGenerate = false)
    var responseId: Int = PROFILE_RESPONSE_ID
}

示例 JSON:

{
  "id": 44,
  "name": "Jason",
  "code": "jason",
  "title": "Jason Scott",
  "profile_image": "https://sampleurl.com/sample_profile.jpg",
  "background_image": "",
  "messages": [
    {
      "id": 0001,
      "message": "Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.",
      "timestamp": "Thu, 01 Jan 1970 01:00:00 +0100",
    }
    {
      "id": 0002,
      "message": "Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.",
      "timestamp": "Thu, 01 Jan 1970 01:00:00 +0100",
    }
    {
      "id": 0003,
      "message": "Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.",
      "timestamp": "Thu, 01 Jan 1970 01:00:00 +0100",
    }
}

1
就像你提到的,messages是空的,但Kotlin编译器认为messages不为空,而你正在尝试将其设置为空。 - Srikar Reddy
检查服务器是否向您发送了 messages_ JSON 对象,并且它已正确转换为 messages 数组列表。 - Srikar Reddy
而且,你想要将它保存到多个表中,对吗? - Srikar Reddy
请使用Postman测试您的API,然后检查响应中的所有数据。 - Ashish
1
@Jason 嵌入式工作用于将单个对象的字段嵌入实体表中。对于对象列表,您拥有一对多关系,并在 Room 中使用 Relation 注释在新的 POJO 中进行建模(以及对当前代码进行一些更改)。https://developer.android.com/training/data-storage/room/defining-data#object-relationships - user
显示剩余4条评论
1个回答

3
我通过移除@Embedded解决了这个问题,因为我不一定需要另一个表中的数据,并添加了一个TypeConverter将列表转换为字符串并返回(此问题有所帮助)。供其他人参考:

TypeConvertor类

class Convertors {

    @TypeConverter
    fun listToJson(value: List<Message>?): String {
        return Gson().toJson(value)
    }

    @TypeConverter
    fun jsonToList(value: String): List<Message>? {
        val objects = Gson().fromJson(value, Array<Message>::class.java) as Array<Message>
        val list = objects.toList()
        return list
    }

}

然后将@TypeConverters添加到我的数据库类中。
数据库类
@Database(entities = [ProfileResponse::class], version = 1)
@TypeConverters(Convertors::class)
abstract class MainDatabase: RoomDatabase() {

    abstract fun profileResponseDao(): ProfileResponseDao

}

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