У меня проблема с Room ORM, работающим на Kotlin. Моя задача - иметь возможность сохранять и получать модели данных 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
Итак, с примерами кода в документе и учебниках я создаю RouteTemplateModel
, который содержит объект RouteModel
и список AddressModels
. Вот класс
Модель шаблона маршрута
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, даже если они помечены как ненулевые или примитивные. Столбцы, возвращаемые запросом: [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)
}
Это действительно сбивает с толку. Помогите пожалуйста мне)