使用ServerValue.TIMESTAMP设置Firebase值时遇无效优先级错误求助
解决Firebase ServerValue.TIMESTAMP设置错误的问题
你遇到的问题是因为对Firebase setValue方法的重载使用有误,导致把时间戳的Map当成了节点优先级传入,触发了无效优先级的错误。
问题根源
你最后一行代码:
beerExpiration.child(beer.id).setValue("timestamp", serverTimeStamp)
这里调用的是Firebase的setValue(value: Any?, priority: Any?)重载方法——第二个参数被识别为节点优先级,而Firebase规定优先级只能是字符串、双精度浮点数、ServerValue或者Null,你传入的serverTimeStamp是一个Map,显然不符合要求,所以报错。
正确的两种实现方式
方式1:直接用Map作为setValue的参数
如果要在beerExpiration/beer/{beerId}节点下创建timestamp字段并赋值为服务器时间戳,直接把你的时间戳Map传给setValue即可:
val serverTimeStamp = mapOf("timestamp" to ServerValue.TIMESTAMP) beerExpiration.child(beer.id).setValue(serverTimeStamp)
执行后,目标节点下会生成一个timestamp字段,值为Firebase服务器的当前时间戳。
方式2:用updateChildren更新指定字段
如果目标节点已经存在其他数据,只想新增或更新timestamp字段,推荐使用updateChildren,避免覆盖节点下的其他数据:
beerExpiration.child(beer.id).updateChildren(mapOf("timestamp" to ServerValue.TIMESTAMP))
完整修正后的代码示例
val userRef = database.reference.child(userId).child("cache") val beerRef = userRef.child("beers") beerRef.child(beer.id).setValue(beer) val beerExpiration = userRef.child("expiration/beer") // 用updateChildren直接设置timestamp字段 beerExpiration.child(beer.id).updateChildren(mapOf("timestamp" to ServerValue.TIMESTAMP))
这样就能正确设置服务器时间戳,不会再出现路径优先级无效的错误了。
内容的提问来源于stack exchange,提问作者alexpfx
相关产品推荐
相关产品推荐

