微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决房间类型转换器:将String日期转换为Long

我正在尝试将我的字符串日期转换为存储在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可以工作了,这并不是我当前用例的解决方案。

解决方法

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。