为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用Firebase服务器时间戳生成创建日期?

如何使用Firebase服务器时间戳生成创建日期?

慕无忌1623718 2019-11-02 14:11:10
目前,谷歌的版本的ServerValue.TIMESTAMP回报{".sv":"timestamp"}这是用来作为一个火力地堡的指令一旦将数据保存到服务器火力地堡,以填补该领域与服务器的时间戳。但是,当您在客户端上创建数据时,您尚没有实际的时间戳(即,用作创建日期)。在最初的保存和随后的检索之后,您将只能访问时间戳,我想这有时为时已晚且不太优雅。在Google之前:更新:忽略本部分,因为它是不正确的-我误解了示例。ServerValue.TIMESTAMP总是返回{".sv":"timestamp"}。据我了解,在Google之前的Firebase中,似乎有一个由服务器生成的时间戳,可以让您获取实际的时间戳:import com.firebase.client.ServerValue;ServerValue.TIMESTAMP // eg. 1466094046问题:这样的保存/检索是在模型实例上获取服务器生成的创建日期的唯一方法吗?如果可以,您可以提出一种实现这种模式的方法吗?我是否正确理解ServerValue.TIMESTAMP已随着Google收购Firebase发生了变化?更新:不,@ FrankvanPuffelen回答说,收购期间没有任何变化。注意:我new Date()一直在阅读它并不安全,因此我不考虑在客户端使用它,但是如果您有不同意见,请分享您的想法。
查看完整描述

2 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

我的做法有所不同。


解决方案1:push()POJO中的方法


因为我不想用奇怪的吸气剂或属性弄乱我的POJO,所以我只是push()在POJO中定义一个如下所示的方法:


/**

 * 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)

        }

}

然后,我可以简单地创建POJO的实例并对其进行调用push(),以正确填充创建时间属性。


这无疑使POJO变得简单一些,并包含了POJO不应该知道的逻辑。但是,使用此处@Exclude某些响应中概述的注释和/或强制转换也需要了解存储机制。


解决方案2:助手或DatabaseReference扩展程序(Kotlin)


为了克服这个问题,您当然也可以pushTask(task: Task)在助手中创建一个方法,或者-如果使用Kotlin-一个扩展方法,例如DatabaseReference,看起来像这样:


fun DatabaseReference.push(pojo: Pojo) {

    push()

    .apply {

        setValue(pojo)

        child(Pojo.CREATED_AT_KEY).setValue(ServerValue.TIMESTAMP)

    }

}

现在来看它,我开始觉得我实际上更喜欢第二种方法(如果我可以使用Kotlin-我不喜欢帮助者)。但这可能只是口味问题。;)


查看完整回答
反对 回复 2019-11-02
  • 2 回答
  • 0 关注
  • 524 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信