我对使用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, "")
}
以下是我的简单模型,我在Room的文档中发现,为了在模型之间创建关系,我需要使用@ForeignKey
和@Relation
因此,在doc和tutorials中的代码示例中,我创建了RouteTemplateModel
,其中包含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
}
}
那么问题是什么?我收到了这样的错误:
错误:查询返回的列没有字段[id] 在com.innotech.webcab3kotlin.model.RouteTemplateModel尽管虽然 它们被注释为非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)
}
这真令人困惑。请帮帮我
答案 0 :(得分:0)
您的“parentId”列只能保存长值,将其类型设置为“Text”,然后从“List”创建TypeConverter到String,反之亦然以供参考,请查看link。