Вопрос:

Как сохранить новый тип объекта Timestamp firestore в локальной базе данных Android для Android?

android sqlite google-cloud-firestore android-room

10 просмотра

2 ответа

298 Репутация автора

Я храню дату в Firestore, используя новый тип объекта, недавно введенный в Firestore, который находится в Timestamp . Я хочу сохранить тот же объект Timestamp в моей комнате с SQLite .

Насколько мне известно, Room не поддерживает Timestamp. Но он поддерживает TypeConverter.

Есть ли какой-либо TypeConverter для преобразования Timestamp. Моя забота состоит в том, чтобы избежать использования двух разных конверсий даты для Firestore и Room в моем коде. Но поскольку это ограничение существует, я бы не прочь использовать TypeConverter для преобразования взад и вперед при хранении в Комнате. Таким образом, я все еще могу использовать Timestamp на уровне кода.

Благодаря,

Автор: channae Источник Размещён: 24.09.2018 08:05

Ответы (2)


0 плюса

58246 Репутация автора

Объекты метки времени содержат всего два целочисленных значения - секунды с момента unix и доли секунды (измеренные в наносекундах). Если вам не нужна предельная точность наносекунд, вы можете просто сохранить секунды с момента эпохи и считать, что дробная часть равна 0.

Если вам нужны оба значения, вам нужно будет сопоставить их с двумя разными столбцами в sqlite.

Насколько я знаю, для вас не существует существующего программного обеспечения, но для реализации этого должно быть тривиально.

Автор: Doug Stevenson Размещён: 24.09.2018 04:28

0 плюса

8429 Репутация автора

a (1: 1), TypeConverterвероятно, сможет сопоставить два столбца (исправьте меня, если я ошибаюсь); но можно использовать определение класса так же, как и @Embeddedаннотацию на поле другого класса:

// @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 int getNanoSeconds() {
        return (int) this.nanoseconds;
    }

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

    public String toString() {
        return String.valueOf(this.seconds) + "." + String.valueOf(this.nanoseconds);
    }
}
Автор: Martin Zeitler Размещён: 24.09.2018 04:44
Вопросы из категории :
32x32