我正在尝试将我的字符串日期转换为存储在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可以工作了,这并不是我当前用例的解决方案。
答案 0 :(得分:1)
我还没有看到Room的注释处理器的源代码,但是我想它仅将Type转换器用于自定义类型(不适用于String
,Int
等)。
我猜注释处理器在构建过程中是这样的:
Int
,String
,Double
之类的类型,只需将它们与SQLite类型(INTEGER
,TEXT
)匹配,并为那。因此,对于这些类型,似乎所有类型转换器都将被忽略。Date
和其他类型),它会检查类型转换器,因为它不知道如何将其转换为SQLite类型。如果没有声明这样的转换器-如果存在,则会出现错误-注释处理器将使用类型转换器的映射方法生成Java代码。它与Dao方法使用的原理相同(从SQLite支持类型转换为自定义类型)。从技术上讲,作为一种解决方法,您可以创建字符串包装器类(具有单个String
字段),将该类用作类型而不是当前的String
类型,并为此类型实现类型转换器和Long
之间的班级。