我正在使用Timestamp中最近在Firestore中引入的新对象类型在Firestore中存储日期。我想将这些相同的Timestamp对象存储在由SQLite支持的Room中。
据我所知,Room不支持时间戳。但是它支持TypeConverter。
有没有可用的TypeConverter来转换时间戳。我的担心是要避免在我的代码中对Firestore和Room进行两次不同的日期转换。但是由于存在限制,当存储在Room中时,我不介意使用TypeConverter来回转换。这样,我仍然可以在代码级别使用时间戳。
谢谢
答案 0 :(得分:0)
Timestamp对象仅包含两个整数值-距unix纪元以来的秒数,以及秒数的分数(以纳秒为单位)。如果您不需要极高的纳秒精度,则只需存储自历元以来的秒数,并假设小数部分为0。
如果您确实需要两个值,则需要将它们映射到sqlite中的两个不同列。
据我所知,尚无软件可以为您完成此操作,但是实现此功能应该很简单。
答案 1 :(得分:0)
TypeConverter
将无法映射两列(只能转换为String
或Date
表示形式);可以将下面的类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);
}
}