我使用 ORMLite 来保存 SQLite 数据库中的对象,但保存 LocalDateTime 值不起作用。我已经配置了一个自定义持久化类,如下所示:
public class LocalDateTimePersister extends TimeStampType {
private static final LocalDateTimePersister singleTon = new LocalDateTimePersister();
String dateFormat = "yyyy-MM-dd'T'HH:mm:ss";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern(dateFormat);
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
private LocalDateTimePersister() {
super(SqlType.STRING, new Class<?>[] { LocalDateTime.class });
}
public static LocalDateTimePersister getSingleton() {
return singleTon;
}
@Override
public Object javaToSqlArg(FieldType fieldType, Object javaObject) {
LocalDateTime dateTime = (LocalDateTime) javaObject;
if (dateTime == null) {
return null;
} else {
return dateTime.format(dtf);
}
}
@Override
public Object sqlArgToJava(FieldType fieldType, Object sqlArg, int columnPos) {
return LocalDateTime.parse((String) sqlArg, dtf);
}
}
它正确保存了值,但加载对象会导致此异常:
java.text.ParseException: Unparseable date: "2023-10-15T12:57:46.000" does not match (\p{Nd}++)\Q-\E(\p{Nd}++)\Q-\E(\p{Nd}++)\Q \E(\p{Nd}++)\Q:\E(\p{Nd}++)\Q:\E(\p{Nd}++)\Q.\E(\p{Nd}++)
数据库中保存的时间值是“2023-10-15T12:57:46”,所以我不知道带有毫秒值的字符串来自哪里。我的 javaToSqlArg 方法中的断点没有被命中,我看不出到底是什么导致了这个错误。
此外,我注意到创建表时没有应用外键约束,尽管属性进行了适当的注释。因此,当我删除父对象时,子对象只会保留在数据库中。有没有办法在不使用文本查询创建表的情况下更改它?
java.text.ParseException: Unparseable date: "2023-10-15T12:57:46.000" does not match (\p{Nd}++)\Q-\E(\p{Nd}++)\Q-\E(\p{Nd}++)\Q \E(\p{Nd}++)\Q:\E(\p{Nd}++)\Q:\E(\p{Nd}++)\Q.\E(\p{Nd}++)
如果您仔细查看生成的模式错误消息,我会在中间看到
\Q \E
,而我本来期望的是 \QT\E
。您确定生成错误的模式与您在帖子中描述的一样吗?
(\p{Nd}++)\Q-\E(\p{Nd}++)\Q-\E(\p{Nd}++)\Q \E(\p{Nd}++)\Q:\E(\p{Nd}++)\Q:\E(\p{Nd}++)\Q.\E(\p{Nd}++)
^^^^^
您的代码确实具有的任何机会:
String dateFormat = "yyyy-MM-dd' 'HH:mm:ss";
如果确实有
T
那么我不确定发生了什么。
灰色