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

时间:2018-09-25 19:56:00

标签: android firebase google-cloud-firestore

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

  

ServerTimestamp

     

公共抽象@interface ServerTimestamp实现注释

     

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

这听起来好像是对对象字段进行了注释,然后将该对象写入本地,然后在本地查询,然后该字段将包含current server timestamp。当然,这将意味着本地Firestore实例在某些时候将其时钟与服务器同步。这是真的吗?

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

2 个答案:

答案 0 :(得分:1)

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

  • 估计
  

返回尚未设置的ServerTimestamp的本地估计值   达到最终价值。此估算值可能与最终估算值有所不同   值,并可能导致这些待处理的值在服务器一旦更改   结果可用。

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

  • 上一个
  

为尚未返回的ServerTimestamps返回先前的值   设置为其最终值。

答案 1 :(得分:0)

Android Firestore文档似乎公开了Clock Skew

  

时钟偏斜

     

firebase.database.ServerValue.TIMESTAMP却更多   准确,并且对于大多数读/写操作更可取,它可以   有时有助于估计客户的时钟偏差   关于Firebase实时数据库服务器的信息。您可以附加一个   回调到位置/.info/serverTimeOffset以获得值,   以毫秒为单位,Firebase Realtime Database客户端添加到   当地的报告时间(以毫秒为单位的时间)来估算   服务器时间。请注意,此偏移量的精度可能受以下因素影响:   网络延迟,因此主要用于发现大型   (> 1秒)时钟时间差异。

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");
  }
});

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