greendao timestamp 格式问题以及其转换

greendao timestamp 格式问题以及其转换

在用 greendao 的时候遇到一个有意思的小问题,当把 sqlite 数据库中的 timestamp 字段映射到 java 的 date 时,出现时间不正确,date 的值变成了 1970-00-00 00:00:xx ,然后查看了下 date 的 getTime() 方法,发现这个 epoch 值居然是原来正确时间的年份 2018, 剩下的部分都没有转换过来。在 stackoverflow 也有个人遇到相同的问题,见 https://stackoverflow.com/questions/22172331/greendao-date-type-returning-1-jan-1970

问题原因

跟踪了下代码,发现问题其实挺简单:在 dump 数据并放入到 sqlite 时,这个 timestamp 字段存成了 string ,值为 2018-11-23 12:31:25;greendao 在生成 dao 代码时,date 字段会使用游标的 getLong() 读取(按 android 的 sqlite 标准,在读取 timestamp 时,用 getLong() ),导致格式转换时只取得了年份 2018 ,用了这个数作为 epoch 值来创建 Date。

以上过程可在 intellij 上,查 greendao 生成的 dao 的 readEntity() 方法的代码, 文件位置为 'build/generated/source/<包名>/xxxDao'。 readEntity() 为从游标生成实体对象的方法,它会按照每字段从游标中取数据并进行字段初始化。

解决方法

做一个通用的 StringDateConverter,把字符串格式转换为正确的日期:

public class StringDateConverter implements PropertyConverter<Date, String> {
    private final static List<String> FORMATS = Arrays.asList(
            "yyyy-MM-dd HH:mm:ss"
    );

    @Override
    public Date convertToEntityProperty(String databaseValue) {
        Date date = null;
        for (String format : FORMATS) {
            try {
                date = DateUtils.parseDate(databaseValue, format);
                break;
            } catch (ParseException e) {
                // do nothing
            }
        }
        if (date == null) {
            date = new Date(0);
        }
        return date;
    }

    @Override
    public String convertToDatabaseValue(Date entityProperty) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return format.format(entityProperty);
    }
}

然后在每个 Date 字段上,加一个转换器:

@Entity(nameInDb = "t_user")
public class User {
    ...
    @Property(nameInDb = "birthday")
    @Convert(converter = StringDateConverter.class, columnType = String.class)
    private Date birthday;
    ...
}

重新生成 dao 代码后,可以看到对应的字段已做了转换:

...birthdayConverter.convertToEntityProperty(cursor.getString(offset + 7));

数据的读取已正常。

posted @ 2019-06-28 11:58 drop * 阅读(...) 评论(...) 编辑 收藏