ServerTimestamp is allways null on Firebase Firest

2019-01-02 16:30发布

I am trying to add a timestamp field in an Android client with Firebase Firestore.

According to the documentation ( https://firebase.google.com/docs/reference/android/com/google/firebase/firestore/ServerTimestamp ):

Annotation used to mark a Date field to be populated with a server timestamp. If a POJO being written contains null for a @ServerTimestamp-annotated field, it will be replaced with a server-generated timestamp.

But when I try it:

@ServerTimestamp
Date serverTime = null; // I tried both java.util.Date and java.sql.Date

//...

Map<String, Object> msg = new HashMap<>();
// ... more data
msg.put("timestamp", serverTime);

On the Cloud Firestore database this field is always null.

3条回答
高级女魔头
2楼-- · 2019-01-02 16:43

That is not the correct way of how to add the time and date to a Cloud Firestore database. The best practice is to have a model class in which you can add a date filed of type Date togheter with an annotation. This is how your model class should look like:

import java.util.Date;

public class YourModelClass {
    @ServerTimestamp
    private Date date;

    YourModelClass() {}

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }
}

When you create on object of YourModelClass class, there is no need to set the date. Firebase servers will read your date field as it is a ServerTimestamp (see the annotation), and it will populate that filed with the server timestamp accordingly.

Another approach would be to use FieldValue.serverTimestamp() method like this:

Map<String, Object> map = new HashMap<>();
map.put("date", FieldValue.serverTimestamp());
docRef.update(map).addOnCompleteListener(new OnCompleteListener<Void>() {/* ... */}
查看更多
ら面具成の殇う
3楼-- · 2019-01-02 16:55

I have similar problem, and I found this at my catlog and solved my problem

firebaseFirestore = FirebaseFirestore.getInstance();
FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
                .setTimestampsInSnapshotsEnabled(true)
                .build();
firebaseFirestore.setFirestoreSettings(settings);
查看更多
泛滥B
4楼-- · 2019-01-02 16:57

use FieldValue.serverTimestamp() get server timestamp

Map<String, Object> msg = new HashMap<>();
msg.put("timestamp", FieldValue.serverTimestamp());
查看更多
登录 后发表回答