将日期保存到Room数据库时,TypeConverter会对数据进行加密

时间:2018-06-19 01:26:54

标签: java android sqlite android-room

我一直在研究这个问题几个小时,我似乎无法弄清楚如何将日期保存到我的Room Sqllite数据库。我基本上是从Android文档中复制代码来批量执行此操作。

这就是我所拥有的。

数据库:

@Database(entities = {Review.class},
        version = 3,
        exportSchema=false)
@TypeConverters(DateTypeConverter.class)
public abstract class NotecardDatabase extends RoomDatabase {
...etc...
}

实体:

    @Entity(tableName = "review",
        indices = {
                @Index(value = "next_review"),
        }
public class Review {
...Other columns...
    @TypeConverters(DateTypeConverter.class)
    @ColumnInfo(name ="next_review")
    @NonNull
    private Date nextReview;
}

接下来,我的转换器:

public class DateTypeConverter {

    private static Logger log = Logger.getLogger("DateTypeConverter");
    @TypeConverter
    public static Date fromTimestamp(Long value) {
        if(value != null) {
            log.info("Incoming long: " + value + "\nTo Date: " + new Date(value));
        }
        return value == null ? null : new Date(value);

    }

    @TypeConverter
    public static Long dateToTimestamp(Date date) {
        if(date != null) {
            log.info("Incoming date: " + date + "\n to Long: " + date.getTime());
        }
        return date == null ? null : date.getTime();
    }
}

最后,这是我在运行时得到的输出,当我尝试创建一些Review对象时:

06-18 18:13:38.522 7081-7098 / DateTypeConverter: 传入日期:星期一6月18日18:13:38 PDT 2018   到龙:1529370818524

06-18 18:13:38.522 7081-7106 / DateTypeConverter: 传入长:1529370818 迄今为止:太阳 Jan 18 08:49:30 PST 1970

所以它似乎正确保存(参见第一个日志语句),但是当我从数据库中取出东西时,long的最后3位数字被简单地删除,在1970年返回一个日期。

帮助?

2 个答案:

答案 0 :(得分:2)

好的,所以经过大量的工作,我找出了问题所在。感谢所有尝试在此方面提供帮助的人。

我从“日期”更改为“日历”,但这并不是解决此问题的原因。

真正的问题是,有两个时间戳:Linux时间戳(自时代以来为毫秒)和Java / Sqllite时间戳(自时代以来为 seconds )。

为了使所有内容都能很好地与Sqllite函数配合使用并保存和正确读取,这是我的工作代码:

l.label

请注意cal.getTimeInMillis()函数的用法,该函数明确指出我们正在执行毫秒时间戳。然后,当保存到数据库时,我们将除以1000以保存 seconds 时间戳,因为Sqllite日期函数处理了 seconds 时间戳。

还请注意,您可能也可以使用Longs代替Strings,但是Strings对我有用。

答案 1 :(得分:0)

而不是@TypeConverters(DateTypeConverter.class)

使用

@TypeConverters({DateTypeConverter.class})