我尝试使用服务器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")
val serverTimeStamp = mapOf(Pair("timestamp", ServerValue.TIMESTAMP))
beerExpiration.child(beer.id).setValue("timestamp", serverTimeStamp)
我收到此错误:
io.reactivex.exceptions.OnErrorNotImplementedException: Path '/xxxxxxxx/cache/expiration/beer/4010' contains invalid priority: Must be a string, double, ServerValue, or null
at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:704)
at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:701)
at io.reactivex.internal.observers.LambdaObserver.onError(LambdaObserver.java:77)
at io.reactivex.internal.observers.LambdaObserver.onNext(LambdaObserver.java:67)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:200)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:252)
at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:109)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6776)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)
答案 0 :(得分:1)
您将serverTimeStamp定义为带有
的地图val serverTimeStamp = mapOf(Pair("timestamp", ServerValue.TIMESTAMP))
然后,您尝试使用
将服务器中的时间戳值设置为此地图beerExpiration.child(beer.id).setValue("timestamp", serverTimeStamp)
而不是将其设置为ServerValue.TIMESTAMP
我认为您的问题将由(未经测试)确定
beerExpiration.child(beer.id).setValue("timestamp", ServerValue.TIMESTAMP)
答案 1 :(得分:1)
ServerValue.TIMESTAMP
已经是Map<String, String>
。实际上,您正尝试将Map<String, Map<String, String>>
发送到Firebase,但它并不满意。
您可能只想摆脱val serverTimeStamp = mapOf(Pair("timestamp", ServerValue.TIMESTAMP))
并将ServerValue.TIMESTAMP
传递给setValue。
作为一小部分,如果您使用a to b
符号为您创建一对,那么构建地图的方式可能更短,更多Kotlinesque,如mapOf("thing" to "foo")
。
答案 2 :(得分:0)
我最终使用:
val map = hashMapOf("timestamp" to ServerValue.TIMESTAMP)
ref.child(id).setValue(map)
或类似的java api代码:
val map = Collections.singletonMap("timestamp", ServerValue.TIMESTAMP)
ref.child(id).setValue("timestamp", ServerValue.TIMESTAMP)
它有效。
当我尝试下面的代码时,正如其他人的建议一样:
ref.child(id).setValue("timestamp", ServerValue.TIMESTAMP)
它持续存在&#34;时间戳&#34;字面意思:
实际上存储服务器值的正确方法是将地图传递给setValue,就像[here] [2]中的这个例子一样:
HashMap<String, Object> updatedTimeStamp = new HashMap<>();
updatedTimeStamp.put(Constants.FIREBASE_PROPERTY_TIMESTAMP, ServerValue.TIMESTAMP);