房间类型转换器:将String日期转换为Long

时间:2020-10-30 12:55:06

标签: android kotlin type-conversion android-room

我正在尝试将我的字符串日期转换为存储在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的格式存储为字符串

我已经使用类型转换器成功将Date格式转换为Long,但是我目前的用例是将字符串转换为long。如果有人可以专门帮助处理字符串,那将是很棒的。

请澄清一下,我已经有Date to long converter可以工作了,这并不是我当前用例的解决方案。

1 个答案:

答案 0 :(得分:1)

我还没有看到Room的注释处理器的源代码,但是我想它仅将Type转换器用于自定义类型(不适用于StringInt等)。

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

  • 它使用@Entity查找类,并检查字段的类型。对于IntStringDouble之类的类型,只需将它们与SQLite类型(INTEGERTEXT)匹配,并为那。因此,对于这些类型,似乎所有类型转换器都将被忽略。
  • 对于其他类型(Date和其他类型),它会检查类型转换器,因为它不知道如何将其转换为SQLite类型。如果没有声明这样的转换器-如果存在,则会出现错误-注释处理器将使用类型转换器的映射方法生成Java代码。它与Dao方法使用的原理相同(从SQLite支持类型转换为自定义类型)。

从技术上讲,作为一种解决方法,您可以创建字符串包装器类(具有单个String字段),将该类用作类型而不是当前的String类型,并为此类型实现类型转换器和Long之间的班级。