首页 > 解决方案 > Room Database:如何嵌入具有 ArrayList 字段的对象模型?

问题描述

我有这样的模型

@Entity(tableName = "user_table")
class UserModel
    : Serializable {
    @PrimaryKey
    @NonNull
    var userId: String = ""

    @Embedded
    var location: LocationModel = LocationModel()
    ...
    }

    data class LocationModel(
        var city : String = "",
        var province : String = "",
        @TypeConverters(ConvertersDAO::class)
        var coordinates : ArrayList<Double> = ArrayList()
    )
}

和一个 ConvertersDAO 类

class ConvertersDAO {
    @TypeConverter
    fun fromStringDouble(value: String?): ArrayList<Double>? {
        val listType: Type = object : TypeToken<ArrayList<Double>>() {}.type
        return Gson().fromJson(value, listType)
    }

    @TypeConverter
    fun fromArrayListDouble(list: ArrayList<Double>?): String? {
        val gson = Gson()
        return gson.toJson(list)
    }
}

但是当我构建应用程序时出现此错误

error: Cannot figure out how to save this field into database. You can consider adding a type converter for it.
        private java.util.ArrayList<java.lang.Double> coordinates;

我尝试将@TypeConverter 放在位置上,但我仍然无法工作,我该怎么办?祝大家拥有美好的一天!

标签: kotlinandroid-room

解决方案


您可以将 @TypeConverters(ConvertersDAO::class) 放在:-

级别(该数据库中的@Database所有 Daos 和 Entities 都可以使用它。),例如

@Database(entities = [UserModel::class],version = 1)
@TypeConverters(ConvertersDAO::class)

@Entity级别(实体的所有字段都可以使用它)例如

@Entity(tableName = "user_table")
@TypeConverters(ConvertersDAO::class) 

并且您应该能够在@Entity's member/field级别上对其进行编码,例如

@Embedded
@TypeConverters(ConvertersDAO::class)
var location: LocationModel = LocationModel()
  • 测试时,上述所有编译成功。

https://developer.android.com/reference/androidx/room/TypeConverters


推荐阅读