Android 房间在插入前解析
Android Room parse before inserting
想象一下从端点接收到这样的对象
data class Foo(
val name: String,
val start: String,
val end: String
)
其中属性 start
和 end
是格式为“00:00:00”的字符串,表示从午夜开始的小时、分钟和秒。
我需要将此对象保存在房间中 table,但开始和结束被解析为 Int 而不是字符串。
我的解决办法是这样的:
data class Foo(
val name: String,
val start: String,
val end: String,
var startInSeconds: Int = 0,
var endInSeconds: Int = 0
) {
init {
startInSeconds = this.convertTimeInSeconds(this.start)
endInSeconds = this.convertTimeInSeconds(this.end)
}
private fun convertTimeInSeconds(time: String): Int {
val tokens = time.split(":".toRegex())
val hours = Integer.parseInt(tokens[0])
val minutes = Integer.parseInt(tokens[1])
val seconds = Integer.parseInt(tokens[2])
return 3600 * hours + 60 * minutes + seconds
}
}
但我想避免每次都解析开始和结束。
有插入前解析的方法吗?
如果你愿意,可以尝试我的解决方案,
- 首先,与其使用相同的对象
Foo
来存储您的数据,不如创建另一个 data class
作为 Entity
以 封装[=26] =]数据。
data class Bar(
val name: String,
val start: String,
val end: String,
val startInSeconds: Int, // <<-- using val to make data read only
val endInSeconds: Int // <<-- using val to make data read only
)
- 您可能需要创建一千个
object
取决于您的数据大小,因此使用 companion object
似乎是解析数据以避免 不必要的内存的好主意分配 .
data class Bar(
val name: String,
val start: String,
val end: String,
val startInSeconds: Int,
val endInSeconds: Int
) {
companion object {
// overloading the invoke function
operator fun invoke(foo:Foo) : Bar {
return Bar(
name = foo.name,
start = foo.start,
end = foo.end,
startInSeconds = convertTimeInSeconds(foo.start),
endInSeconds = convertTimeInSeconds(foo.end)
)
}
private fun convertTimeInSeconds(time: String): Int {
val tokens = time.split(":".toRegex())
val hours = Integer.parseInt(tokens[0])
val minutes = Integer.parseInt(tokens[1])
val seconds = Integer.parseInt(tokens[2])
return 3600 * hours + 60 * minutes + seconds
}
}
}
//how to use
fun insertToDatabase(foo:Foo){
val parsedData = Bar(foo)
dao.insert(parsedData)
}
想象一下从端点接收到这样的对象
data class Foo(
val name: String,
val start: String,
val end: String
)
其中属性 start
和 end
是格式为“00:00:00”的字符串,表示从午夜开始的小时、分钟和秒。
我需要将此对象保存在房间中 table,但开始和结束被解析为 Int 而不是字符串。
我的解决办法是这样的:
data class Foo(
val name: String,
val start: String,
val end: String,
var startInSeconds: Int = 0,
var endInSeconds: Int = 0
) {
init {
startInSeconds = this.convertTimeInSeconds(this.start)
endInSeconds = this.convertTimeInSeconds(this.end)
}
private fun convertTimeInSeconds(time: String): Int {
val tokens = time.split(":".toRegex())
val hours = Integer.parseInt(tokens[0])
val minutes = Integer.parseInt(tokens[1])
val seconds = Integer.parseInt(tokens[2])
return 3600 * hours + 60 * minutes + seconds
}
}
但我想避免每次都解析开始和结束。
有插入前解析的方法吗?
如果你愿意,可以尝试我的解决方案,
- 首先,与其使用相同的对象
Foo
来存储您的数据,不如创建另一个data class
作为Entity
以 封装[=26] =]数据。
data class Bar(
val name: String,
val start: String,
val end: String,
val startInSeconds: Int, // <<-- using val to make data read only
val endInSeconds: Int // <<-- using val to make data read only
)
- 您可能需要创建一千个
object
取决于您的数据大小,因此使用companion object
似乎是解析数据以避免 不必要的内存的好主意分配 .
data class Bar(
val name: String,
val start: String,
val end: String,
val startInSeconds: Int,
val endInSeconds: Int
) {
companion object {
// overloading the invoke function
operator fun invoke(foo:Foo) : Bar {
return Bar(
name = foo.name,
start = foo.start,
end = foo.end,
startInSeconds = convertTimeInSeconds(foo.start),
endInSeconds = convertTimeInSeconds(foo.end)
)
}
private fun convertTimeInSeconds(time: String): Int {
val tokens = time.split(":".toRegex())
val hours = Integer.parseInt(tokens[0])
val minutes = Integer.parseInt(tokens[1])
val seconds = Integer.parseInt(tokens[2])
return 3600 * hours + 60 * minutes + seconds
}
}
}
//how to use
fun insertToDatabase(foo:Foo){
val parsedData = Bar(foo)
dao.insert(parsedData)
}