【问题标题】:How to store Object Types in Room如何在房间中存储对象类型
【发布时间】:2020-03-13 00:19:06
【问题描述】:

我刚开始在 Android 上使用 Room,遇到了一些困难。我有一个名为“Employee”的类,它具有字符串名称和具有其属性的 Object EmployeeType。我需要在 Room 实体表中表示两者,还需要检查是否存在空值,因为它们可能为空值。

data class Employee(

    @field:SerializedName("name")
    val name: String? = null,

    @field:SerializedName("employee_type")
    val employeeType: EmployeeType? = null,
)

data class EmployeeType(

    @field:SerializedName("full_staff")
    val fullStaff: String? = null,

    @field:SerializedName("contract_staff")
    val contractStaff: String? = null 
)

@Entity
class EmployeeTable (

    @PrimaryKey(autoGenerate = true)
    val id: Int,

    @ColumnInfo(name = "name")
    val name: String

    //.. represent EmployeeType here for both full_staff and contract_staff
    //.. also EmployeeTypes could be null, how do I handle null pointers
)


// My DOA

@Dao
interface EmployeeTableDao {
    @Query("select * from EmployeeTable order by id DESC")
    fun findAll(): LiveData<List<EmployeeTable>>

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insert(employeeTable: List<EmployeeTable>)
}

// API sample

    {
        "staff": [
            {
                "name": "Jeff",
                "employee_type": {
                    "full_staff": "No",
                    "contract_staff": "Yes"
                }
            },
            //...
       ],
    }

请问我该如何实现?

【问题讨论】:

  • @CommonsWare 谢谢,但嵌入式不起作用。错误:无法弄清楚如何从游标中读取此字段。
  • 是否要将员工类型存储在另一个表中?
  • “谢谢,但是嵌入式不起作用”——该网页上有多种技术。 “错误:无法弄清楚如何从光标读取此字段”——您可以考虑针对该问题提出一个单独的 Stack Overflow 问题,并使用 minimal reproducible example 来解决该问题以及完整的错误消息。
  • 感谢@CommonsWare 我终于创建了一个 json 转换器并且效果很好。

标签: android android-room


【解决方案1】:

为了将员工数据存储在同一个表中,并稍后在 Kotlin 中访问相同的数据,请在 EmployeeTable 实体类中创建一个 EmployeeType 类型的变量,并创建一个 TypeConvertor 并将其注册到数据库类。 TypeConvertor 将使用 GSONEmployeeType 转换为 JSON 字符串以存储在 DB 中,并在从 DB 访问时返回到 EmployeeType

@Entity
class EmployeeTable (

    @PrimaryKey(autoGenerate = true)
    val id: Int,

    @ColumnInfo(name = "name")
    val name: String

    @ColumnInfo(name = "employee_type")
    val emmployeeType: EmployeeType
)

转换器类

class EmployeeTypeConvertor {

    @TypeConverter
    fun fromEmployeeType(employeeType: EmployeeType): String {
        return /* JSON string using GSON or something */
    }

    @TypeConverter
    fun toEmployeeType(employeeType: String): EmployeeType {
        return /* EmployeeType from JSON string using GSON or something */
    }
}

【讨论】:

  • 我已经说过我在我的 cmets 中创建了一个转换器,解决了问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2018-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
相关资源
最近更新 更多