Android Room 和 Kotlin 布尔数组
Android Room and Kotlin Boolean Array
我已经查看了很多与此相关的 Stack 答案,但我仍然不明白。我有一个 @Embedded class,但我宁愿这是一个包含三个元素的布尔数组。有人可以用线索棒打我并帮助我重新设计这个实体来处理这个或提供我需要的 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
}
谢谢。
一般来说,我不建议将 Room 实体、Retrofit 响应和类似的东西视为您的内存数据模型。它们是数据传输对象,因为它们受到您的 UI 和应用程序内逻辑不需要处理的限制。在类似 Retrofit 的情况下,服务器组织和交付数据的方式可能与您希望如何处理应用程序中的数据几乎没有相似之处。在您的情况下,您需要三个不同的列,这意味着三个不同的 Kotlin 属性,无论是在实体中还是在 @Embedded
对象中,就像您拥有的那样。
一种典型的方法是使用 PersonDTO
或 PersonEntity
或 Room 使用的东西,然后将其转换为具有所需结构的 to/from 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
值可迭代结构。
我已经查看了很多与此相关的 Stack 答案,但我仍然不明白。我有一个 @Embedded class,但我宁愿这是一个包含三个元素的布尔数组。有人可以用线索棒打我并帮助我重新设计这个实体来处理这个或提供我需要的 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
}
谢谢。
一般来说,我不建议将 Room 实体、Retrofit 响应和类似的东西视为您的内存数据模型。它们是数据传输对象,因为它们受到您的 UI 和应用程序内逻辑不需要处理的限制。在类似 Retrofit 的情况下,服务器组织和交付数据的方式可能与您希望如何处理应用程序中的数据几乎没有相似之处。在您的情况下,您需要三个不同的列,这意味着三个不同的 Kotlin 属性,无论是在实体中还是在 @Embedded
对象中,就像您拥有的那样。
一种典型的方法是使用 PersonDTO
或 PersonEntity
或 Room 使用的东西,然后将其转换为具有所需结构的 to/from 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
值可迭代结构。