使用Room ORM Kotlin

时间:2017-11-09 16:13:20

标签: kotlin android-room

我对使用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)


}

这真令人困惑。请帮帮我

1 个答案:

答案 0 :(得分:0)

您的“parentId”列只能保存长值,将其类型设置为“Text”,然后从“List”创建TypeConverter到String,反之亦然以供参考,请查看link