Android 如何使用Firebase服务器时间戳生成创建日期?
目前,谷歌版本的Android 如何使用Firebase服务器时间戳生成创建日期?,android,firebase,timestamp,firebase-realtime-database,Android,Firebase,Timestamp,Firebase Realtime Database,目前,谷歌版本的ServerValue.TIMESTAMP返回{.sv:“TIMESTAMP”},当您将数据保存到Firebase服务器时,它被用作Firebase的一个指令,用服务器时间戳填充该字段 但是,当您在客户端创建数据时,您还没有实际的时间戳(即用作创建日期)。只有在初始保存和随后的检索之后,您才能访问时间戳,我想这有时太晚了,也不是很优雅 在谷歌之前: 更新:忽略此部分,因为它不正确-我误解了示例ServerValue.TIMESTAMP始终返回{.sv:“TIMESTAMP”}
ServerValue.TIMESTAMP
返回{.sv:“TIMESTAMP”}
,当您将数据保存到Firebase服务器时,它被用作Firebase的一个指令,用服务器时间戳填充该字段
但是,当您在客户端创建数据时,您还没有实际的时间戳(即用作创建日期)。只有在初始保存和随后的检索之后,您才能访问时间戳,我想这有时太晚了,也不是很优雅
在谷歌之前: 更新:忽略此部分,因为它不正确-我误解了示例
ServerValue.TIMESTAMP
始终返回{.sv:“TIMESTAMP”}
据我所知,在google Firebase之前的版本中,似乎有一个服务器生成的时间戳,允许您获取实际的时间戳:
导入com.firebase.client.ServerValue;
ServerValue.TIMESTAMP//例如1466094046
(,)
问题:
注意:
我没有考虑在客户端使用
new Date()
,因为我一直在读它是不安全的,尽管如果您有不同的想法,请分享您的想法。当您在写操作中使用ServerValue.TIMESTAMP
常量时,您是说Firebase数据库服务器在执行写操作时应该确定正确的时间戳
假设我们运行以下代码:
ref.addValueEventListener(new ValueEventListener() {
public void onDataChange(DataSnapshot dataSnapshot) {
System.out.println(dataSnapshot.getValue());
}
public void onCancelled(DatabaseError databaseError) { }
});
ref.setValue(ServerValue.TIMESTAMP);
这将按如下方式执行:
ServerValue.TIMESTAMP
ChildEventListener
而不是ValueEventListener
,则客户端将在步骤3中调用onchildaded
,在步骤8中调用onChildChanged
自Firebase加入Google以来,我们生成
ServerValue.TIMESTAMP
的方式没有任何改变。以前有效的代码将继续有效。这也意味着是一种有效的处理方法。当您在写入操作中使用ServerValue.TIMESTAMP
常量时,您的意思是Firebase数据库服务器在执行写入操作时应确定正确的时间戳
假设我们运行以下代码:
ref.addValueEventListener(new ValueEventListener() {
public void onDataChange(DataSnapshot dataSnapshot) {
System.out.println(dataSnapshot.getValue());
}
public void onCancelled(DatabaseError databaseError) { }
});
ref.setValue(ServerValue.TIMESTAMP);
这将按如下方式执行:
ServerValue.TIMESTAMP
ChildEventListener
而不是ValueEventListener
,则客户端将在步骤3中调用onchildaded
,在步骤8中调用onChildChanged
自Firebase加入Google以来,我们生成
ServerValue.TIMESTAMP
的方式没有任何改变。以前有效的代码将继续有效。这也意味着这是一种有效的处理方法。我的做法有点不同
解决方案1:push()
POJO中的方法
由于我不想用奇怪的getter或属性将POJO弄得乱七八糟,我只是在POJO中定义了一个push()
方法,如下所示:
/**
* Pushes a new instance to the DB.
*
* @param parentNode `DatabaseReference` to the parent node this object shall be attached to
*/
fun push(parentNode: DatabaseReference) {
parentNode
.push()
.apply {
setValue(this@Pojo)
child(Pojo.CREATED_AT_KEY).setValue(ServerValue.TIMESTAMP)
}
}
fun DatabaseReference.push(pojo: Pojo) {
push()
.apply {
setValue(pojo)
child(Pojo.CREATED_AT_KEY).setValue(ServerValue.TIMESTAMP)
}
}
然后,我可以简单地创建POJO的一个实例,并在其上调用push()
,从而正确填充creation time属性
这无疑使POJO变得不那么简单,并且涉及POJO不应该知道的逻辑。但是,使用一些响应中概述的@Exclude
注释和/或强制转换也需要了解存储机制
解决方案2:Helper或数据库参考
扩展(Kotlin)
为了克服这个问题,您当然也可以在助手中创建一个pushTask(task:task)
方法,或者(如果使用Kotlin)一个扩展方法,例如DatabaseReference
,它可以如下所示:
/**
* Pushes a new instance to the DB.
*
* @param parentNode `DatabaseReference` to the parent node this object shall be attached to
*/
fun push(parentNode: DatabaseReference) {
parentNode
.push()
.apply {
setValue(this@Pojo)
child(Pojo.CREATED_AT_KEY).setValue(ServerValue.TIMESTAMP)
}
}
fun DatabaseReference.push(pojo: Pojo) {
push()
.apply {
setValue(pojo)
child(Pojo.CREATED_AT_KEY).setValue(ServerValue.TIMESTAMP)
}
}
现在看着它,我开始觉得我实际上更喜欢第二种方法(如果我有Kotlin在我的支配下-我不喜欢助手)。但这可能只是品味的问题 我的做法有点不同 解决方案1:
push()
POJO中的方法
由于我不想用奇怪的getter或属性将POJO弄得乱七八糟,我只是在POJO中定义了一个push()
方法,如下所示:
/**
* Pushes a new instance to the DB.
*
* @param parentNode `DatabaseReference` to the parent node this object shall be attached to
*/
fun push(parentNode: DatabaseReference) {
parentNode
.push()
.apply {
setValue(this@Pojo)
child(Pojo.CREATED_AT_KEY).setValue(ServerValue.TIMESTAMP)
}
}
fun DatabaseReference.push(pojo: Pojo) {
push()
.apply {
setValue(pojo)
child(Pojo.CREATED_AT_KEY).setValue(ServerValue.TIMESTAMP)
}
}
然后,我可以简单地创建一个POJO实例,并在其上调用push()
,从而正确填充cre