Firebase сортировка данных по дочернему не работает - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь разработать простое приложение для изучения базы данных Firebase.

Вот моя схема базы данных в реальном времени

mydirectory
 -contact_list
   -LOyDhepB_IZlM6lZtko
      mobileNumber: "9385746982"
      name: "Jay"
   -LOyDhetiPHalLhXrOaU
      mobileNumber: "8000478912"
      name: "Ravi"
   -LOyDhetiPHalLhXrOaV
      mobileNumber: "123456789"
      name: "ABC"
   -LOyDheubruATyyBp8dG
      mobileNumber: "023456879"
      name: "XYZ"

Я хочу получить список данных, упорядоченный по name

Поэтому я использую этот фрагмент для загрузки данных в свое приложение для Android

DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference();
mDatabase.child("contact_list").orderByChild("name").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            Map<String, Object> objectMap = (HashMap<String, Object>) dataSnapshot.getValue();
            Master.personList.clear();
            for (Object obj : objectMap.values()) {
                if (obj instanceof Map) {
                    Map<String, Object> mapObj = (Map<String, Object>) obj;
                    String name = (String) mapObj.get("name");
                    String mobileNumber = (String) mapObj.get("mobileNumber");
                    Person person = new Person(name, mobileNumber);
                    Master.personList.add(person);

                    populateListView();
                }
            }
        }

        @Override
        public void onCancelled(DatabaseError error) {
            // Failed to read value
            Log.w("ANDs", "Failed to read value.", error.toException());
        }
    });

Но он не сортирует данные на основеалфавитный порядок name ключ.Я делаю что-то не так или что-то упустил?

PS

У меня также есть правила индексации ( ref ),но результат все тот же!Он не сортирует данные по алфавиту.

{
 "rules": {
    "mydirectory": {
        "contact_list": {
        "$user_id": {
          ".indexOn": ["name"]
        }
        }
    },
    ".read": true,
    ".write": true
  }
}

Я пробовал много вещей из других сообщений, подобных этой теме, но ничего не работает!Пожалуйста, не делайте это дубликатом, пожалуйста, помогите мне решить это!

1 Ответ

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

A HashMap может содержать только ключ и значение.А ключи в Map по определению не упорядочены.Поэтому, когда вы звоните dataSnapshot.getValue(), вы выбрасываете всю информацию о заказе.

Чтобы поддерживать заказ, вам нужно выполнить цикл dataSnapshot.getChildren():

public void onDataChange(DataSnapshot dataSnapshot) {
    Master.personList.clear();

    for (DataSnapshot contactSnapshot: dataSnapshot.getChildren()) {
        String name = contactSnapshot.child("name").getValue(String.class);
        String mobileNumber = contactSnapshot.child("mobileNumber").getValue(String.class);
        Person person = new Person(name, mobileNumber);
        Master.personList.add(person);
    }

    populateListView();
}

You 'Также обратите внимание, что я использую child(...), чтобы получить дочерний снимок для определенного свойства и получить из него значение String.Ваш подход для этого тоже подойдет, но я обнаружил, что получаю лучшие сообщения об ошибках, когда дольше сохраняю снимок (вместо преобразования в Map).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...