Невозможно сохранить модель данных, содержащую List‹Model›, с Room ORM Kotlin

У меня проблема с 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)


}

Это действительно сбивает с толку. Помогите пожалуйста мне)


person Roman Golub    schedule 09.11.2017    source источник


Ответы (1)


Ваш столбец «parentId» может содержать только длинное значение, сделайте его тип «текстовым», затем создайте преобразователь типа из «списка» в строку и наоборот для справки, пожалуйста, посмотрите ссылка .

person Pinakin Kansara    schedule 20.11.2017