Путь XX содержит недопустимый приоритет: должен быть String, Double, ServerValue или Null - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь установить значение для ребенка, используя сервер 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 голосов
/ 02 мая 2018

ServerValue.TIMESTAMP уже Map<String, String>. По сути, вы пытаетесь отправить Map<String, Map<String, String>> в Firebase, что вас не устраивает.

Вы можете просто захотеть избавиться от val serverTimeStamp = mapOf(Pair("timestamp", ServerValue.TIMESTAMP)) и просто передать ServerValue.TIMESTAMP в setValue.

Если немного отойти от темы, то, как вы строите свою Карту, она может быть короче и более поточна, если вы используете нотацию a to b, которая создает для вас пару, как в mapOf("thing" to "foo").

0 голосов
/ 04 мая 2018

Я использую:

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)

Он сохраняет «метку времени» как литерал:

enter image description here

На самом деле правильный способ хранения значения сервера - это передать карту в setValue, как показано в примере из [здесь] [2]:

HashMap<String, Object> updatedTimeStamp = new HashMap<>();
    updatedTimeStamp.put(Constants.FIREBASE_PROPERTY_TIMESTAMP, ServerValue.TIMESTAMP);
0 голосов
/ 02 мая 2018

Вы определяете 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...