Firebase ServerValue # TIMESTAMP с updateChildren () - PullRequest
0 голосов
/ 10 марта 2019

У меня есть этот картограф, который делает следующее:

override fun map(model: Model) = mapOf<String, Any?>(
  ...,
  KEY_TIMESTAMP to (model.timestamp.takeIf { it > -1 } ?: ServerValue.TIMESTAMP),
  ...
)

Когда мне нужно одновременно разместить несколько моделей в разных местах, я беру маппер и использую его для преобразования модели в Map<String, Any?>. Итак, у меня есть куча карт, которые затем объединяются в одну большую Map<String, Any?> Это выглядит так:

{
   "messages/-L_bXQUibioB6OMkl0SE/text": "Android Developer created this conversation",
   "messages/-L_bXQUibioB6OMkl0SE/senderName": "system",
   "messages/-L_bXQUibioB6OMkl0SE/senderAvatarUrl": null,
   "messages/-L_bXQUibioB6OMkl0SE/timestamp/.sv": "timestamp",
   "messages/-L_bXQUibioB6OMkl0SE/attachment": null,
   "chats/participants/UZ684hcHTnOkaglUX0QwbR9DK442/name": "cool guy",
   "chats/participants/UZ684hcHTnOkaglUX0QwbR9DK442/imageUrl": null,
   "chats/participants/aqiTRMAUOSdJIuEOvNJpeAb4D0F3/name": "Android Developer",
   "chats/participants/aqiTRMAUOSdJIuEOvNJpeAb4D0F3/imageUrl": "https://firebasestorage...",
   "chats/lastMessage": "Android Developer created this conversation",
   "chats/lastMessageTimestamp/.sv": "timestamp",
   "chats/name": null,
   "chats/imageUrl": null,
   "chats/type": "SINGLE"
}

Итак, я просто делаю это:

ovveride fun updateChildren(data: Map<String, Any?>) = Completable.create { emitter ->
    rootRef.updateChildren(data) { databaseError, _ ->
        databaseError?.toException()
            ?.let(emitter::onError)
            ?: emitter.onComplete()
    }
}

Когда этот последний код вызывается, я получил следующее исключение:

com.google.firebase.database.DatabaseException: Path '/messages/-L_bXQUibioB6OMkl0SE/timestamp/.sv' contains disallowed child name: .sv
        at com.google.firebase.database.core.utilities.Validation.parseAndValidateUpdate(com.google.firebase:firebase-database@@16.0.5:140)
        at com.google.firebase.database.DatabaseReference.updateChildrenInternal(com.google.firebase:firebase-database@@16.0.5:428)
        at com.google.firebase.database.DatabaseReference.updateChildren(com.google.firebase:firebase-database@@16.0.5:418)

Как я могу это исправить и по-прежнему использовать ServerValue.TIMESTAMP, если это возможно?

1 Ответ

1 голос
/ 10 марта 2019

Это потому, что эта строка:

"messages/-L_bXQUibioB6OMkl0SE/timestamp/.sv": "timestamp"

должна выглядеть следующим образом:

"messages/-L_bXQUibioB6OMkl0SE/timestamp": {
    ".sv": "timestamp"
}

Ошибка была в методе слияния моей карты. Самый простой способ - отфильтровать такие свойства:

lateinit var entry: MutableMap.MutableEntry<String, Any?>
while (map.entries.find { it.key.endsWith(".sv") }?.apply { entry = this } != null) {
    map.remove(entry.key)
    map[entry.key.removeSuffix("/.sv")] = ServerValue.TIMESTAMP
}

return realtimeDatabase.updateChildren(map)
...