无法使用Room ORM Kotlin保存包含List <Model>的数据模型
我在Kotlin的Room ORM上遇到了一个问题。 我的任务是有能力保存和获取数据模型RouteTemplateModel,它包含AddressModel类型的地址列表和包含特定路由标题的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, "") }
这里是我的简单模型,我在房间的文档中发现,为了创建模型之间的关系,我需要使用@ForeignKey
和@Relation
因此,在doc和tutorials中的代码示例中,我创建了包含RouteModel
对象和RouteModel
列表的AddressModels
。 这是班级
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变量中注释以返回此列,则需要将类注解为Entity(如第二个错误),但是当我这样做时出现错误
错误:实体不能有关系。
这是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) }
那真是令人困惑。 请帮帮我)