【问题标题】:Problem to create room database's "Entity" class from JsonArray/DataModel class in kotlin从 kotlin 中的 Json 数组/数据模型类创建房间数据库“实体”类的问题
【发布时间】:2021-07-15 08:53:13
【问题描述】:

我是房间数据库的新手。我遇到了从 JsonArray 下面创建实体类的问题。

您能否帮助从以下文件创建实体类:

[
{
"id":1,
"name":"Leanne Graham",
"username":"Bret",
"email":"Sincere@april.biz",
"address":{
"street":"Kulas Light",
"suite":"Apt. 556",
"city":"Gwenborough",
"zipcode":"92998-3874",
"geo":{
"lat":"-37.3159",
"lng":"81.1496"
}
},
"phone":"1-770-736-8031 x56442",
"website":"hildegard.org",
"company":{
"name":"Romaguera-Crona",
"catchPhrase":"Multi-layered client-server neural-net",
"bs":"harness real-time e-markets"
}
},
{
"id":2,
"name":"Ervin Howell",
"username":"Antonette",
"email":"Shanna@melissa.tv",
"address":{
"street":"Victor Plains",
"suite":"Suite 879",
"city":"Wisokyburgh",
"zipcode":"90566-7771",
"geo":{
"lat":"-43.9509",
"lng":"-34.4618"
}
},
"phone":"010-692-6593 x09125",
"website":"anastasia.net",
"company":{}
}
]

我的数据模型类如下

    data class MyModel (
    val id: Long,
    val name: String,
    val username: String,
    val email: String,
    val address: Address,
    val phone: String,
    val website: String,
    val company: Company
){

}
data class Address (
    val street: String,
    val suite: String,
    val city: String,
    val zipcode: String,
    val geo: Geo
)
data class Geo (
    val lat: String,
    val lng: String
)

data class Company (
    val name: String,
    val catchPhrase: String,
    val bs: String
)

我不知道我的数据模型类是否正确以及如何从我的数据模型或 Json 生成实体类响应

【问题讨论】:

    标签: android kotlin entity android-room jsonresponse


    【解决方案1】:

    在您的情况下,您可能只有一个 @Entity -> User 和其他您可以用作 @Embeded 对象。

    @Entity
    data class User (
        @PrimaryKey(autoGenerate = true)
        var id: Long = 0,
    
        val name: String,
        val username: String,
        val email: String,
        @Embedded val address: Address,
        val phone: String,
        val website: String,
        @Embedded val company: Company
    )
    

    完整的源代码在这里https://github.com/dautovicharis/sos_android/tree/q_68390737

    在此处了解有关 Room DB 的更多信息https://developer.android.com/training/data-storage/room

    【讨论】:

    • 您可以提供使用的外键和类型转换器的 json/entity 示例。
    • @KetanPatel 当然,我会用这个案例推动新的变化 -> 我会告诉你的。
    • @KetanPatel 我已经使用 Address 模型类的自定义转换器推动了新的变化。如果您没有任何具体原因,最好继续使用 Embeded。更复杂的案例请查看谷歌官方示例 -> github.com/android/sunflower
    【解决方案2】:

    您可以安装 JSON TO Kotlin 类插件并使用它。为此:

    1. 在 Android Studio 中选择文件 -> 设置

    2. 搜索插件

    3. 选择 Marketplace 并搜索“JSON TO Kotlin 类”。

    安装插件后重启 Android Studio。现在您可以使用此插件将 JSON 转换为 Kotlin 类。为此,请按 Alt + k 或按照以下步骤操作:

    1- 转到代码

    2-选择生成

    3- 从 json 中选择 Kotlin 数据类

    现在粘贴 JSON 并在提供类名后单击生成按钮。对于您的 JSON,结果是:

    data class MyModelItem(
        val address: Address,
        val company: Company,
        val email: String,
        val id: Int,
        val name: String,
        val phone: String,
        val username: String,
        val website: String
    )
    
    data class Address(
        val city: String,
        val geo: Geo,
        val street: String,
        val suite: String,
        val zipcode: String
    )
    
    class Company(
    )
    
    data class Geo(
        val lat: String,
        val lng: String
    )
    

    现在您可以创建如下所示的实体:

    @Entity
    data class MyModelEntity(
     @PrimaryKey(autoGenerate = true)
     val id: Int,
     val city: String,
     val lat: String,
     val lng: String,
     val street: String,
     val suite: String,
     val zipcode: String,
     val company: Company,
     val email: String,
     val name: String,
     val phone: String,
     val username: String,
     val website: String
    ) 
    

    在您的 dao 中,您可以按如下方式插入数据:

    @Insert(onConflict = OnConflictStrategy.IGNORE)
    fun addToDatabase(model: MyModelEntity?): Long
    

    最后,您可以在您的存储库中使用以下代码:

     fun insertToDatabase(myModelItem: MyModelItem) {
        val myModelEntity = MyModelEntity(
            city = myModelItem.address.city,
            lat = myModelItem.address.lat,
            lng = myModelItem.address.lng,
            street = myModelItem.address.street,
            suite = myModelItem.address.suite,
            zipcode = myModelItem.address.zipcode,
            company = myModelItem.company,
            email = myModelItem.email,
            name = myModelItem.name,
            phone = myModelItem.phone,
            username = myModelItem.username,
            website = myModelItem.website
        )
        dao.addToDatabase(myModelEntity)
    }
    

    【讨论】:

    • 好的,现在如何从它们生成实体类?你能提供实体类吗
    • 如果有手机阵列怎么办?使用了TypeConverter,但是怎么用呢?
    猜你喜欢
    • 2021-12-04
    • 1970-01-01
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    相关资源
    最近更新 更多