如何在Android的本地数据库Room中存储Firestore的新Timestamp对象类型?

时间:2018-09-24 08:05:49

标签: android sqlite google-cloud-firestore android-room

我正在使用Timestamp中最近在Firestore中引入的新对象类型在Firestore中存储日期。我想将这些相同的Timestamp对象存储在由SQLite支持的Room中。

据我所知,Room不支持时间戳。但是它支持TypeConverter。

有没有可用的TypeConverter来转换时间戳。我的担心是要避免在我的代码中对Firestore和Room进行两次不同的日期转换。但是由于存在限制,当存储在Room中时,我不介意使用TypeConverter来回转换。这样,我仍然可以在代码级别使用时间戳。

谢谢

2 个答案:

答案 0 :(得分:0)

Timestamp对象仅包含两个整数值-距unix纪元以来的秒数,以及秒数的分数(以纳秒为单位)。如果您不需要极高的纳秒精度,则只需存储自历元以来的秒数,并假设小数部分为0。

如果您确实需要两个值,则需要将它们映射到sqlite中的两个不同列。

据我所知,尚无软件可以为您完成此操作,但是实现此功能应该很简单。

答案 1 :(得分:0)

TypeConverter将无法映射两列(只能转换为StringDate表示形式);可以将下面的类TimeStamp与另一个@Embedded中的@Entity注释一起使用。而我只是想知道,是否必须为该类声明tableName

// @Entity(tableName = "tableName")
class TimeStamp {

    @ColumnInfo(name = "seconds")
    private long seconds = 0;

    @ColumnInfo(name = "nanoseconds")
    private Integer nanoseconds = 0;       

    public Timestamp() {}

    @Ignore
    public Timestamp(long s, @Nullable Integer ns) {
        this.setSeconds(s);
        this.setNanoSeconds(ns);
    }

    public void setSeconds(long s) {
        if(s < 0) {s = 0;}
        this.seconds = s;
    }

    public void setNanoSeconds(@Nullable Integer ns) {
        if(ns == null || ns < 0) {ns = 0;}
        this.nanoseconds = ns;
    }

    public long getSeconds() {
        return this.seconds;
    }

    public long getMilliSeconds() {
        return (this.seconds * 1000);
    }

    public int getNanoSeconds() {
        return (int) this.nanoseconds;
    }

    public Date toDate() {
        return new Date(this.getMilliSeconds());
    }

    public String toString() {
        return String.valueOf(this.seconds) + "." + String.valueOf(this.nanoseconds);
    }
}