ORMLite - 持久化 LocalDateTiime - 不可解析的日期

ORMLite - persisting LocalDateTiime - Unparseable date

提问人:Maxim 提问时间:10/15/2023 最后编辑:GrayMaxim 更新时间:10/17/2023 访问量:31

问:

我正在使用 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 Ormlite 数据解析

评论

0赞 Anonymous 10/16/2023
您可能应该将完整的堆栈跟踪粘贴到您的问题中(格式化为代码)。

答:

0赞 Gray 10/17/2023 #1
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