Получить метку времени из пользовательского класса - PullRequest
0 голосов
/ 02 марта 2020

Я искал два часа, и я поражен, что нет простого способа получить Timestamp из Firebase с помощью пользовательского класса.

Вот как выглядит документ, который я получаю:

enter image description here

У меня есть для этого документа простой пользовательский класс:

import com.google.firebase.Timestamp;

import java.util.List;

public class CapObj {
    private String content;
    private List<String> tags;
    private Timestamp created_at;

    public CapObj () {}

    public CapObj (String content, List<String> tags, Timestamp created_at){
        this.content = content;
        this.tags = tags;
        this.created_at = created_at;
    }

    public String getContent() {
        return content;
    }

    public List<String> getTags() {
        return tags;
    }

    public Timestamp getCreatedAt() {
        return created_at;
    }
}

, и я заполняю свой список следующим методом:

private void populateDatasetFromQuery(Task<QuerySnapshot> task){

    ArrayList<Caption> results = new ArrayList<>();
    for (QueryDocumentSnapshot document : task.getResult()) {

        CapObj capObj = document.toObject(Caption.class);
        results.add(caption);
    }
    capObjList = new ArrayList<>(results);
}

Итак, проблема в том, что когда я пытаюсь использовать capObj.getContent(), я получаю контент, но когда я делаю capObj.getCreatedAt().toDate(), я получаю:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.Date com.google.firebase.Timestamp.toDate()' on a null object reference. хотя объект, полученный из запроса Firebase, выглядит следующим образом:

{created_at=Timestamp(seconds=1583017200, nanoseconds=0), content=Travel 2, tags=[travel]}

Мне кажется, что created_at не заполняется при создании объекта. Что я здесь не так делаю?

Ответы [ 2 ]

2 голосов
/ 02 марта 2020

Firestore не знает, как сопоставить поле created_at с вашим объектом. Что вы должны сделать, это создать метод установки publi c, который соответствует полю:

public void setCreated_at(Timestamp timestamp) {
    created_at = timestamp;
}

Так как вы используете подчеркивания в имени поля, это создает уродливое имя сеттера (в соответствии с соглашением для Java POJO), поэтому, возможно, вы захотите дать ему более точное имя и аннотировать его с помощью PropertyName , чтобы Firestore знал, какое поле следует использовать для вызова этого метода:

@PropertyName("created_at")
public void setCreatedAt(Timestamp timestamp) {
    created_at = timestamp;
}

Общее соглашение для всех POJO - иметь одинаковые методы получения и установки publi c с одинаковыми именами свойств (например, getFoo / setFoo).

0 голосов
/ 02 марта 2020

Вместо метки времени вы можете использовать timeinmillies и вам также нужно установить метод: Вы можете сделать так:

import java.util.List;

public class CapObj {
@SerializedName("content")
private String content;
@SerializedName("tags")
private List<String> tags;
@SerializedName("created_at")
private long created_at;

public CapObj () {}

public CapObj (String content, List<String> tags){
    this.content = content;
    this.tags = tags;
    this.created_at = Calendar.getInstance().getTimeInMillis();
}


public void setContent(String content) {
    this.content = content;
}

public void setTags(List<String> tags) {
    this.tags = tags;
}

public long getCreated_at() {
    return created_at;
}

public void setCreated_at(long created_at) {
    this.created_at = created_at;
}


public String getContent() {
    return content;
}

public List<String> getTags() {
    return tags;
}


}

после получения данных вы можете конвертировать long в календарную дату-время, используя метод ниже:

Date getDateFromLong(long timeInMillis){
 Calendar time_date=Calendar.getInstance();
 time_date.setTimeInMillis(timeInMillis);
 return time_date.getTime();
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...