首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >本地Android Firestore实例是否与服务器同步其内部时钟?

本地Android Firestore实例是否与服务器同步其内部时钟?
EN

Stack Overflow用户
提问于 2018-09-26 03:56:00
回答 2查看 288关注 0票数 0

我问的原因是因为我们知道本地写入Firestore是即时的。这意味着可以立即查询本地写入的对象。文档还告诉我们有一个ServerTimestamp注释。

ServerTimestamp

公共抽象@接口ServerTimestamp实现注解

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

这听起来像是这样的:如果一个对象字段被如此注释,并且该对象在本地写入,然后在本地查询,那么该字段将包含current server timestamp。当然,这意味着本地Firestore实例在某个时刻将其时钟与服务器同步。这是真的吗?

如果为真,则可以使用这种技巧来查询当前的Firebase服务器时间,从而有效地同步时钟。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-26 04:21:02

在同步文档之前读回的写入文档的服务器时间戳的默认行为仅仅是空值。您可以使用ServerTimestampBehavior更改此行为。将其枚举传递给getData()以获取以下内容之一:

  • ESTIMATE

返回尚未设置为最终值的ServerTimestamps的本地估计值。此估计值可能与最终值不同,并且一旦服务器结果可用,可能会导致这些挂起的值发生变化。

估计值是根据客户端SDK认为是当前时间的值,使用本地时钟得出的。当写入完全提交时,时间戳可能会更改为实际的服务器值。

  • PREVIOUS

返回尚未设置为最终值的ServerTimestamps的前一个值。

票数 1
EN

Stack Overflow用户

发布于 2018-09-26 05:18:37

看起来Android Firestore文档公开了Clock Skew

时钟偏差

虽然firebase.database.ServerValue.TIMESTAMP要精确得多,并且对于大多数读/写操作是首选的,但它有时也可以用于估计客户端相对于Firebase实时数据库的服务器的时钟偏差。您可以将回调附加到位置/.info/serverTimeOffset以获取Firebase实时数据库客户端添加到本地报告时间(以毫秒为单位的纪元时间)以估计服务器时间的值(以毫秒为单位)。请注意,此偏移量的准确性可能会受到网络延迟的影响,因此主要用于发现时钟时间中的较大(> 1秒)差异。

代码语言:javascript
复制
DatabaseReference offsetRef = FirebaseDatabase.getInstance().getReference(".info/serverTimeOffset");
offsetRef.addValueEventListener(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot snapshot) {
    double offset = snapshot.getValue(Double.class);
    double estimatedServerTimeMs = System.currentTimeMillis() + offset;
  }

  @Override
  public void onCancelled(DatabaseError error) {
    System.err.println("Listener was cancelled");
  }
});

这可能是同步时钟的足够方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52505804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档