【问题标题】:Android Room and Kotlin Boolean ArrayAndroid Room 和 Kotlin 布尔数组
【发布时间】:2018-08-28 19:36:55
【问题描述】:

我已经查看了很多与此相关的 Stack 答案,但我仍然没有得到它。我有一个 @Embedded 类,但我希望这是一个包含三个元素的布尔数组。有人会用线索棒打我并帮助我重新设计这个实体来处理这个问题或提供我需要的 TypeConverter 吗?如果可以避免的话,我宁愿不使用 JSON/GSON 转换器。

data class Bools (val a: Boolean = true,
                  val b: Boolean = true,
                  val c: Boolean = false)

@Entity(tableName = "people_table")
data class Person (@ColumnInfo(name = "first_name") val firstName: String,
                   @ColumnInfo(name = "last_name") val lastName: String,
                   @Embedded
                   val bool: Bools
){
    @PrimaryKey(autoGenerate = true)
    var id: Int = 0
}

谢谢。

【问题讨论】:

  • “我宁愿这是一个包含三个元素的布尔数组”——暂时忽略 Kotlin。您希望数据库模式中的表示形式是什么?如果答案是“我想要三列”,那么您所拥有的就是您的最佳答案,而不是简单地将三个Boolean 属性直接放在Person 中。如果答案是“我想要一个单列”,那么@TypeConverter 可以处理它。
  • 我认为从数据存储的角度来看,拥有三个独立的列是最有意义的。从代码的角度来看,如果这是一个数组,那将是理想的,这样我就可以更快地遍历它或使用整数访问“元素”。我迷失的是如何弥合从数据库存储到数组的差距。

标签: android arrays kotlin android-room


【解决方案1】:

一般来说,我不建议将 Room 实体、Retrofit 响应和类似的东西视为您的内存数据模型。它们是数据传输对象,因为它们受到 UI 和应用内逻辑不需要处理的限制。在像 Retrofit 这样的情况下,服务器组织和交付数据的方式可能与您希望在应用程序中处理数据的方式几乎没有相似之处。在您的情况下,您需要三个不同的列,这意味着三个不同的 Kotlin 属性,无论是在实体中还是在 @Embedded 对象中,正如您所拥有的那样。

一种典型的方法是使用PersonDTOPersonEntity 或其他Room 使用的东西,您可以将其转换为具有所需结构的Person 对象/来自Person 对象:

data class Person (val firstName: String,
                   val lastName: String,
                   val boolsheet: BooleanArray)

@Entity(tableName = "people_table")
data class PersonEntity (@ColumnInfo(name = "first_name") val firstName: String,
                         @ColumnInfo(name = "last_name") val lastName: String,
                         val a: Boolean = true,
                         val b: Boolean = true,
                         val c: Boolean = false
){
    constructor(somebody: Person): this(
      somebody.firstName,
      somebody.lastName,
      somebody.boolsheet[0],
      somebody.boolsheet[1],
      somebody.boolsheet[2]
    )

    @PrimaryKey(autoGenerate = true)
    var id: Int = 0

    fun toPerson(): Person = Person(firstName, lastName, booleanArrayOf(a, b, c))
}

现在,Person 和所有处理它的东西都对 Room 一无所知,而你拥有了你想要的 API。 PersonEntity 将被您的存储库使用,隐藏详细信息。而且,如果有一天您需要让存储库也与服务器通信,那么存储库可以在 Person 和您的 Web 服务 API 所需的表示之间进行规范化。

如果您不喜欢这样,请坚持使用 Person@Embedded,并向其中添加 val boolsheet = booleanArrayOf(bools.a, bools.b, bools.c),以在可迭代结构中获取 Boolean 值。

【讨论】:

    猜你喜欢
    • 2019-03-11
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 2021-11-18
    • 2016-01-30
    相关资源
    最近更新 更多