Android 房间在插入前解析

Android Room parse before inserting

想象一下从端点接收到这样的对象

data class Foo(
    val name: String,
    val start: String,
    val end: String
)

其中属性 startend 是格式为“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
    }
}

但我想避免每次都解析开始和结束。

有插入前解析的方法吗?

如果你愿意,可以尝试我的解决方案,

  1. 首先,与其使用相同的对象 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
) 
  1. 您可能需要创建一千个 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)
}