路径XX包含无效优先级:必须是String,Double,ServerValue或Null

时间:2018-05-02 01:57:41

标签: android firebase firebase-realtime-database kotlin

我尝试使用服务器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)

3 个答案:

答案 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;字面意思:

enter image description here

实际上存储服务器值的正确方法是将地图传递给setValue,就像[here] [2]中的这个例子一样:

HashMap<String, Object> updatedTimeStamp = new HashMap<>();
    updatedTimeStamp.put(Constants.FIREBASE_PROPERTY_TIMESTAMP, ServerValue.TIMESTAMP);