我在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 回答
您的"parentId"列只能保存长值,将其类型设置为"Text"然后从"List"创建一个TypeConverter到String,反之亦然以供参考,请查看link .