Android Room,如何保存一个实体,其中一个变量是密封的 class 对象
Android Room, how to save an entity with one of the variables being a sealed class object
我想在我的 Room 数据库中保存一个对象,其中一个变量可以是同一类型或其他类型。我认为密封的 class 是有意义的,所以我采用了这种方法:
sealed class BluetoothMessageType() {
data class Dbm(
val data: String
) : BluetoothMessageType()
data class Pwm(
val data: String
) : BluetoothMessageType()
}
甚至可以这样,但是没有必要。我发现这个给了我更多的错误,因为它不知道如何处理 open val,所以如果我找到第一个版本的解决方案,我无论如何都会很高兴。
sealed class BluetoothMessageType(
open val data: String
) {
data class Dbm(
override val data: String
) : BluetoothMessageType()
data class Pwm(
override val data: String
) : BluetoothMessageType()
}
然后实体class
@Entity(tableName = MESSAGES_TABLE_NAME)
data class DatabaseBluetoothMessage(
@PrimaryKey(autoGenerate = true)
val id: Long = 0L,
val time: Long = Instant().millis,
val data: BluetoothMessageType
)
我也创建了一个 TypeConverter 来将它与 String 相互转换,所以我认为这不是问题。
首先,这可能吗?我认为这应该以与抽象 class 类似的方式运行,但我也没有设法找到一个可行的解决方案。如果不可能,当我想保存一些可能是一种或另一种类型的数据时,如果没有密封 classes,我应该采取什么样的方法?
在我的例子中,我做了以下事情:
sealed class Status2() {
object Online : Status2()
object Offline : Status2()
override fun toString(): String {
return when (this) {
is Online ->"Online"
is Offline -> "Offline"
}
}
}
class StatusConverter{
@TypeConverter
fun toHealth(value: Boolean): Status2 {
return if (value){
Status2.Online
} else{
Status2.Offline
}
}
@TypeConverter
fun fromHealth(value: Status2):Boolean {
return when(value){
is Status2.Offline -> false
is Status2.Online -> true
}
}
}
@Dao
interface CourierDao2 {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertStatus(courier: CourierCurrentStatus)
@Query("SELECT * FROM CourierCurrentStatus")
fun getCourierStatus(): Flow<CourierCurrentStatus>
}
@Entity
data class CourierCurrentStatus(
@PrimaryKey
val id: Int = 0,
var status: Status2 = Status2.Offline
)
而且效果很好
我想在我的 Room 数据库中保存一个对象,其中一个变量可以是同一类型或其他类型。我认为密封的 class 是有意义的,所以我采用了这种方法:
sealed class BluetoothMessageType() {
data class Dbm(
val data: String
) : BluetoothMessageType()
data class Pwm(
val data: String
) : BluetoothMessageType()
}
甚至可以这样,但是没有必要。我发现这个给了我更多的错误,因为它不知道如何处理 open val,所以如果我找到第一个版本的解决方案,我无论如何都会很高兴。
sealed class BluetoothMessageType(
open val data: String
) {
data class Dbm(
override val data: String
) : BluetoothMessageType()
data class Pwm(
override val data: String
) : BluetoothMessageType()
}
然后实体class
@Entity(tableName = MESSAGES_TABLE_NAME)
data class DatabaseBluetoothMessage(
@PrimaryKey(autoGenerate = true)
val id: Long = 0L,
val time: Long = Instant().millis,
val data: BluetoothMessageType
)
我也创建了一个 TypeConverter 来将它与 String 相互转换,所以我认为这不是问题。
首先,这可能吗?我认为这应该以与抽象 class 类似的方式运行,但我也没有设法找到一个可行的解决方案。如果不可能,当我想保存一些可能是一种或另一种类型的数据时,如果没有密封 classes,我应该采取什么样的方法?
在我的例子中,我做了以下事情:
sealed class Status2() {
object Online : Status2()
object Offline : Status2()
override fun toString(): String {
return when (this) {
is Online ->"Online"
is Offline -> "Offline"
}
}
}
class StatusConverter{
@TypeConverter
fun toHealth(value: Boolean): Status2 {
return if (value){
Status2.Online
} else{
Status2.Offline
}
}
@TypeConverter
fun fromHealth(value: Status2):Boolean {
return when(value){
is Status2.Offline -> false
is Status2.Online -> true
}
}
}
@Dao
interface CourierDao2 {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertStatus(courier: CourierCurrentStatus)
@Query("SELECT * FROM CourierCurrentStatus")
fun getCourierStatus(): Flow<CourierCurrentStatus>
}
@Entity
data class CourierCurrentStatus(
@PrimaryKey
val id: Int = 0,
var status: Status2 = Status2.Offline
)
而且效果很好