【问题标题】:Room type converter: Converting a String date to Long房间类型转换器:将字符串日期转换为长
【发布时间】:2020-10-30 12:55:06
【问题描述】:

我正在尝试将字符串日期转换为长值存储在 Room 数据库中。

我创建了它作为我的类型转换器。

object DateTypeConverter {
@TypeConverter
fun toString(sd: String): Long? {
    val sdf = SimpleDateFormat(Constants.YYYY_MM_DD_HH_MM_SS, Locale.ENGLISH)
    return sdf.parse(sd).time
}

@TypeConverter
fun toLong(longDate: Long): String? {
    val sdf = SimpleDateFormat(Constants.YYYY_MM_DD_HH_MM_SS, Locale.ENGLISH)
    return sdf.format(Date(longDate))
   }
}

但是,当我检查数据库时,日期仍以 2020/10/30 12:48:34 这种格式存储为字符串

我已经使用类型转换器成功地将日期格式转换为 Long,但我当前的用例需要将字符串转换为 long。如果有人可以专门帮助将字符串变长,那就太好了。

只是为了澄清我已经有了 Date to long 转换器,它不是我当前用例的解决方案。

【问题讨论】:

    标签: android kotlin type-conversion android-room


    【解决方案1】:

    我还没有看到 Room 的注解处理器的源代码,但我猜它使用类型转换器只是用于自定义类型(不适用于 StringInt 等)。

    我猜注解处理器在构建过程中是这样工作的:

    • 它查找带有@Entity 的类,并检查字段的类型。对于IntStringDouble 等类型,它只会将它们匹配到 SQLite 类型(INTEGERTEXT)并为此生成样板 Java 代码。因此,对于这些类型,似乎任何类型转换器都被忽略了。
    • 对于其他类型(Date 和其他类型),它会检查类型转换器,因为它不知道如何将它们转换为 SQLite 类型。如果没有声明这样的转换器—​​—你会得到一个错误,如果有——注解处理器使用来自类型转换器的映射方法生成 Java 代码。它用于 Dao 方法的原理相同(从 SQLite 支持的类型转换为自定义类型)。

    作为一种解决方法,您在技术上可以创建字符串包装类(带有单个 String 字段),将此类用作类型而不是当前的 String-type 并为此类的值实现类型转换器 from 和 to Long.

    【讨论】:

    • 感谢您的分析,对了解情况很有帮助。您对在 kotlin 中创建字符串包装类有什么建议吗?我的印象是一个字符串可能是一个包装器,因为没有真正的原始等价物。
    • 我的意思是像data class DateString(val dateString: String) 这样的类。我称它为包装器,因为它不会为String 添加任何附加值,只是保存单个值,但它可能适合 Room 处理
    猜你喜欢
    • 2020-09-06
    • 2023-04-04
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多