如何使用 Android 在 Firestore 中添加时间戳?

Posted

技术标签:

【中文标题】如何使用 Android 在 Firestore 中添加时间戳?【英文标题】:How to add a Timestamp in Firestore with Android? 【发布时间】:2018-07-06 14:18:09 【问题描述】:

我正在尝试使用 Firebase Firestore 在 android 客户端中添加时间戳字段。

根据documentation:

用于标记要使用服务器填充的日期字段的注释 时间戳。如果正在写入的 POJO 包含 null @ServerTimestamp-annotated 字段,它将被替换为 服务器生成的时间戳。

但是当我尝试时:

@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);

在 Cloud Firestore 数据库中,此字段始终为 null

【问题讨论】:

您注释的是局部变量,而不是 POJO 字段。两者有很大区别。 通过该注释,您告诉 Firestore 转换,当使用 POJO 时,必须将 Store DB 中具有相同名称的字段从 Firestore tiemstamp 转换为最新。您必须先设置时间戳。 Firestore 不会自动设置时间戳,因为 Firestore 在创建时不知道应该何时设置时间戳?在更新?在特定领域写?看看阿里的答案 【参考方案1】:

这不是将时间和日期添加到 Cloud Firestore 数据库的正确方法。最佳实践是有一个模型类,您可以在其中添加Date 类型的日期字段和注释。你的模型类应该是这样的:

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;
    

YourModelClass 类的对象上创建时,无需设置日期。 Firebase 服务器将读取您的 date 字段,因为它是 ServerTimestamp(请参阅注释),并且会使用服务器时间戳相应地填充该字段。

另一种方法是像这样使用FieldValue.serverTimestamp() 方法:

Map<String, Object> map = new HashMap<>();
map.put("date", FieldValue.serverTimestamp());
docRef.update(map).addOnCompleteListener(new OnCompleteListener<Void>() /* ... */

【讨论】:

一切都好吗?我可以帮助您了解其他信息吗? 太棒了!现在它正在工作,有效地,在 pojo 类中编写这个字段就可以了。谢谢。 我得到 null Logger.info("Date", new YourModelClass().getDate() + ""); 添加一个包含 mcve 的新问题,以便我和其他用户也可以帮助您。 我没有做任何事情,我只是复制了上面的模型并在日志上打印了日期 Like Log.d("Date",new YourModelClass().getDate()+"") 但我得到了 null 【参考方案2】:

使用FieldValue.serverTimestamp()获取服务器时间戳

Map<String, Object> msg = new HashMap<>();
msg.put("timestamp", FieldValue.serverTimestamp());

【讨论】:

乐于助人:)【参考方案3】:

我有类似的问题,我在我的目录中找到了这个并解决了我的问题

firebaseFirestore = FirebaseFirestore.getInstance();
FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
                .setTimestampsInSnapshotsEnabled(true)
                .build();
firebaseFirestore.setFirestoreSettings(settings);

【讨论】:

【参考方案4】:

我也遇到过类似的问题,

我得到了异常...has type java.sql.Timestamp, got java.util.Date ...,所以我只是将类型从Timestamp 替换为Date(来自java.util.Date)并且工作正常。

【讨论】:

以上是关于如何使用 Android 在 Firestore 中添加时间戳?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 的 RecyclerView 中显示来自 Firestore 的数据?

无法理解数据更改通知如何与 Android 中的 Firestore 一起使用。谁能解释一下? [复制]

Firebase Firestore:如何在 Android 上将文档对象转换为 POJO

如何使用 Android 更新 Firestore 中的数组元素?

Android Firestore 如何在各种查询中使用文档 ID 作为字段

如何将两个集合添加到 Firestore 中的集合 android studio