Как я могу сортировать данные с помощью Firebase? - PullRequest
0 голосов
/ 19 октября 2018

Я создаю небольшое приложение React о покемонах.У меня есть в БД информация обо всех них (около 900+).

Все они содержат поле id, которое является целым числом от 1 до 900+.

Но проблема в том, что ясделать запрос следующим образом:

firebase.database().ref(`mydb`).orderByChild('id').startAt(1).limitToFirst(limit).once('value')

Результаты не верны: у меня есть массив идентификаторов, подобный этому: [9,1, 10, 6, 4]

Я что-то не так делаю?

Редактировать: я добавляю результат, полученный при выполнении запроса, который я написал выше, я добавил поле custom_id, содержащее идентификаторы в виде строк, но у меня все еще неупорядоченный результат:

[
  {
    "base_experience": 239,
    "custom_id": "009",
    "height": 16,
    "id": 9,
    "is_default": true,
    "location_area_encounters": "https://pokeapi.co/api/v2/pokemon/9/encounters",
    "name": "blastoise",
    "order": 12,
    "weight": 855
  },
  {
    "base_experience": 64,
    "custom_id": "001",
    "height": 7,
    "id": 1,
    "is_default": true,
    "location_area_encounters": "https://pokeapi.co/api/v2/pokemon/1/encounters",
    "name": "bulbasaur",
    "order": 1,
    "weight": 69
  },
  {
    "base_experience": 39,
    "custom_id": "010",
    "height": 3,
    "id": 10,
    "is_default": true,
    "location_area_encounters": "https://pokeapi.co/api/v2/pokemon/10/encounters",
    "name": "caterpie",
    "order": 14,
    "weight": 29
  },
  {
    "base_experience": 240,
    "custom_id": "006",
    "height": 17,
    "id": 6,
    "is_default": true,
    "location_area_encounters": "https://pokeapi.co/api/v2/pokemon/6/encounters",
    "name": "charizard",
    "order": 7,
    "weight": 905
  },
  {
    "base_experience": 62,
    "custom_id": "004",
    "height": 6,
    "id": 4,
    "is_default": true,
    "location_area_encounters": "https://pokeapi.co/api/v2/pokemon/4/encounters",
    "name": "charmander",
    "order": 5,
    "weight": 85
  },
  {
    "base_experience": 142,
    "custom_id": "005",
    "height": 11,
    "id": 5,
    "is_default": true,
    "location_area_encounters": "https://pokeapi.co/api/v2/pokemon/5/encounters",
    "name": "charmeleon",
    "order": 6,
    "weight": 190
  },
  {
    "base_experience": 142,
    "custom_id": "002",
    "height": 10,
    "id": 2,
    "is_default": true,
    "location_area_encounters": "https://pokeapi.co/api/v2/pokemon/2/encounters",
    "name": "ivysaur",
    "order": 2,
    "weight": 130
  },
  {
    "base_experience": 63,
    "custom_id": "007",
    "height": 5,
    "id": 7,
    "is_default": true,
    "location_area_encounters": "https://pokeapi.co/api/v2/pokemon/7/encounters",
    "name": "squirtle",
    "order": 10,
    "weight": 90
  },
  {
    "base_experience": 236,
    "custom_id": "003",
    "height": 20,
    "id": 3,
    "is_default": true,
    "location_area_encounters": "https://pokeapi.co/api/v2/pokemon/3/encounters",
    "name": "venusaur",
    "order": 3,
    "weight": 1000
  },
  {
    "base_experience": 142,
    "custom_id": "008",
    "height": 10,
    "id": 8,
    "is_default": true,
    "location_area_encounters": "https://pokeapi.co/api/v2/pokemon/8/encounters",
    "name": "wartortle",
    "order": 11,
    "weight": 225
  }
]

1 Ответ

0 голосов
/ 19 октября 2018

Вы не прикрепили свой образ базы данных, но при заказе одно можно сказать, что эти ключи в вашей базе данных являются строками.И когда вы заказываете строковые данные, они упорядочиваются лексикографически.

Так что для чисел это нормальный порядок:

1
9
10

Нодля строк это нормальный порядок:

"9"
"1"
"10"

Я не думаю, что в Firebase есть оператор (ни вбольшинство других баз данных), чтобы изменить это поведение.

Вместо этого вам придется изменить данные, чтобы получить желаемое поведение.Итак: сохраняйте значения в том порядке, в котором они вам нужны при лексикографической сортировке.

Для чисел вы можете сделать это, заполнив их нулями:

"001"
"009"
"010"

РЕДАКТИРОВАТЬ: Теперь после Json эти значения сохраняются в поле id, поэтому вышеприведенное не относится к этому.

Однако вы можете использовать такой код, чтобы делать то, что вы пытаетесь:

mDatabase
  .child("main_child")
  .orderByChild("id")
  .addValueEventListener(new ValueEventListener() {
    public void onDataChange(DataSnapshot snapshot) {
      for (DataSnapshot child: snapshot.getChildren()) {
        System.out.println(child.getKey());
      }
    }
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...