2016-09-21 3 views
1

В моем андроида приложения я использую следующий кодOrderByChild() не работает в клиенте Android

FirebaseDatabase database = FirebaseDatabase.getInstance(); 

    ref = database.getReference().child(Keys.CONTACTIFY_CONTACTS).child(sharedPrefs.getString(SharedPreferenceValues.CURRENT_USER_UID, "")).child(Keys.SHARED_CONTACTS); 
    refer = ref.orderByChild(Keys.TIME); 
refer.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       ArrayList<HashMap<String, Object>> sharedList = new ArrayList<HashMap<String, Object>>(); 
       if (dataSnapshot.getValue() != null) { 
        Object[] rootData = ((HashMap<String, Object>) dataSnapshot.getValue()).values().toArray(); 
        for (Object singleElement : 
          rootData) { 
         HashMap<String, Object> eachElement = (HashMap<String, Object>) singleElement; 
         sharedList.add(eachElement); 
        } 
        recyclerView.setAdapter(new SharedItemsRecyclerViewAdapter(sharedList, mListener, getActivity())); 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 

Моя firebase структура базы данных

enter image description here

Мои Firebase правила актуальны для сценария

{ 
    "rules": { 
    "mapper":{ 
     ".read": "auth!= null", 
     ".write": "auth!= null" 
    }, 
     "share_id_mapper":{ 
     ".read": "auth!= null", 
     ".write": "auth!= null" 
    }, 
     "contactify_contacts":{ 
         //can read a message if authenticated 
       "$uid": { 
        "shared_contacts": {".indexOn": "time", 
          ".write": "auth!= null", 

Проблема в том, что я получаю hasmap из моментального снимка в сортированном по умолчанию способе, то есть sortbyKey(). Но я ожидаю, что результат будет основан на значении ключа времени в данных узла.

ответ

2

При выполнении запроса к базе данных Firebase возвращается DataSnapshot ключи, значения и порядок результатов.

Но тогда вы преобразовать снимок в Map:

((HashMap<String, Object>) dataSnapshot.getValue()) 

На данный момент клиент Firebase не имеет другого выбора, кроме как отказаться от информации о порядке результатов.

Решение этой проблемы заключается в перебрать ребенок моментальных снимков, с методами из DataSnapshot и только затем преобразовать значение:

public void onDataChange(DataSnapshot dataSnapshot) { 
    List<String, Object> data = new ArrayList<String,Object>(); 
    for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) { 
     data.add(childSnapshot.getKey(), childSnapshot.getValue()); 
    } 
} 

Недавно мы добавили образец этого к нашим query documentation.

+0

Это работает, однако Список data = new ArrayList (); - это путаница, но отдых был ОК ;-). –

+0

Как насчет того, чтобы изменить порядок по умолчанию по возрастанию или по убыванию? –

+0

https://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#reverse(java.util.List) –

Смежные вопросы