DataSnapshot.getValue() недокументированное странное поведение

Что тут происходит?

assertEquals(mapOf("161" to "a", "163" to "b"), Firebase.database.getReference("case").get().await().value)
assertEquals(mapOf("1" to "hello", "3" to "hi"), Firebase.database.getReference("case2").get().await().value)

java.lang.AssertionError: ожидалось:<{1=hello, 3=hi}>, но было:<[null, hello, null, hi]>

Интеграция Angular - Firebase Analytics
Интеграция Angular - Firebase Analytics
Узнайте, как настроить Firebase Analytics и отслеживать поведение пользователей в вашем приложении Angular.
1
0
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда Firebase SDK обнаруживает дочерние свойства с числовыми ключами с низким значением, расположенными близко друг к другу, он преобразует значения в массив. А поскольку некоторые последовательные ключи отсутствуют, они в конечном итоге оказываются значениями null в массиве.

Невозможно отключить это приведение массива. Поэтому, чтобы избежать подобных проблем, я обычно использую для таких ключей короткий буквенно-цифровой префикс. Ставьте лайки "key_1", "key_3" и т. д.

Также см.: Лучшие практики: массивы в Firebase и другие вопросы об этом приведении массивов.

Это могло бы быть задокументировано в описании getValue.

nbransby 05.05.2024 02:01

глядя на источник Android SDK, кажется, что использование формата экспорта позволяет избежать приведения массива

nbransby 05.05.2024 20:17

Другие вопросы по теме