首页 文章

无法使用Room ORM Kotlin保存包含List <Model>的数据模型

提问于
浏览
2

我在Kotlin工作的房间ORM有问题 . 我的任务是能够保存和获取数据模型RouteTemplateModel,其中包含AddressModel类型的地址列表和包含特定路径 Headers 的类RouteModel的对象 . 这是我的代码:

AddressModel.kt

@Entity(foreignKeys = arrayOf(
                        ForeignKey(entity = RouteModel::class,
                        parentColumns = arrayOf("routeId"),
                        childColumns = arrayOf("parentId"))))
data class AddressModel(
   @PrimaryKey(autoGenerate = true)
            var addressId: Long,
            var parentId: Long,
            var street: String,
            var house: String,
            var entrance: String,
            var title: String){
            constructor(): this(0, 0, "", "", "", "")         
}

RouteModel.kt

@Entity
data class RouteModel(
    @PrimaryKey(autoGenerate = true)
    var routeId: Long,
    var title: String) {
    constructor() : this(0, "")
}

这是我的简单模型,我在Room的文档中发现,为了在模型之间创建关系,我需要使用 @ForeignKey@Relation

因此,在doc和tutorials中的代码示例中,我创建 RouteTemplateModel ,其中包含 RouteModel 的对象和 AddressModels 的列表 . 这是 class

RouteTemplateModel

class RouteTemplateModel{

    private var id: Long = 0

    @Embedded
    private var routeModel: RouteModel = RouteModel()

    @Relation(parentColumn = "routeId", entityColumn = "parentId")
    private var addressList: List<AddressModel> = listOf()

    constructor()

    constructor(id: Long, routeModel: RouteModel, title: String,
                addressList: List<AddressModel>){
        this.id = id
        this.routeModel = routeModel
        this.addressList = addressList
    }

    fun getId(): Long{
        return id
    }

    fun getRouteModel(): RouteModel{
        return routeModel
    }

    fun getAddressList(): List<AddressModel>{
        return addressList
    }

    fun setId(id: Long){
        this.id = id
    }

    fun setRouteModel(routeModel: RouteModel){
        this.routeModel = routeModel
    }

    fun setAddressList(addressList: List<AddressModel>){
        this.addressList = addressList
    }

}

那么问题是什么?我收到这样的错误:

错误:查询返回的列在com.innotech.webcab3kotlin.model.RouteTemplateModel中没有字段[id],即使它们注释为非null或原始 . 查询返回的列:[routeId,title]

错误:参数的类型必须是使用@Entity或其集合/数组注释的类 .

这是一个真正的问题,因为如果我试图修复第一个错误并在 RouteTemplateModel id变量中注释也返回此列,我需要注释类作为实体(如第二个错误),但是当我这样做时,我收到一个错误

错误:实体不能有关系 .

这是 AppDatabase.kt

@Database(entities = arrayOf(RouteModel::class, AddressModel::class), version = 1)
abstract class AppDatabase : RoomDatabase() {

    abstract fun getRouteDao(): RouteDao
}

RouteDao.kt

@Dao
interface RouteDao {


    @Query("SELECT routeId, title FROM RouteModel")
    fun getAll(): List<RouteTemplateModel>

    @Insert
    fun insertAll(vararg models: RouteTemplateModel)

    @Delete
    fun delete(model: RouteTemplateModel)


}

多数民众赞成在困惑 . 请帮我)

1 回答

  • 0

    您的"parentId"列只能保存长值,将其类型设置为"Text"然后从"List"创建一个TypeConverter到String,反之亦然以供参考,请查看link .

相关问题