Android Room和Kotlin布尔数组

Android Room和Kotlin布尔数组,android,arrays,kotlin,android-room,Android,Arrays,Kotlin,Android Room,我已经回顾了很多与此相关的堆栈答案,但我仍然不明白。我有一个@Embedded类,但我希望它是一个包含三个元素的布尔数组。请有人打一个线索棒我,并帮助我重新设计这个实体来处理这个或提供我需要的类型转换器?如果可以避免的话,我宁愿不使用JSON/GSON转换器 data class Bools (val a: Boolean = true, val b: Boolean = true, val c: Boolean = fal

我已经回顾了很多与此相关的堆栈答案,但我仍然不明白。我有一个@Embedded类,但我希望它是一个包含三个元素的布尔数组。请有人打一个线索棒我,并帮助我重新设计这个实体来处理这个或提供我需要的类型转换器?如果可以避免的话,我宁愿不使用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
}

谢谢。

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

一种典型的方法是将
PersonDTO
PersonEntity
或房间使用的东西转换为/从
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<代码>个人属性将由存储库使用,隐藏详细信息。而且,如果有一天您还需要让存储库与服务器进行通信,那么存储库可以在
Person
和Web服务API所需的表示之间进行规范化


如果您不喜欢,请坚持使用您的
Person
@Embedded
,并在其上添加
val boolsheet=booleanArrayOf(bools.a,bools.b,bools.c)
,以获得可移植结构中的
布尔值。

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