2017-02-23 30 views
3

我遇到了一個奇怪的問題,其中使用orderByChild()的Firebase查詢並未實際排序數據。下面是我想對數據進行排序的快照:(一共是關閉這個例子的目的)使用Firebase訂購數據Android

Snapshot of data

這是我到目前爲止已經使用的代碼:

Query query = locationComment.orderByKey(); 
    query.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      if (dataSnapshot.getValue() == null) { 
       return; 
      } 
      data.clear(); 
      adapter.notifyDataSetChanged(); 
      String userId; 
      String time; 
      String comment; 
      Map<String, String> commentMap = (Map) dataSnapshot.getValue(); 
      for (Map.Entry<String, String> entry : commentMap.entrySet()) { 
       if(!((entry.getKey()).contains("total"))) { 
        String[] keyString = (entry.getKey()).split(","); 
        time = keyString[0]; 
        userId = keyString[1]; 
        comment = entry.getValue(); 
        Date resultdate = new Date(Integer.parseInt(time)); 
        data.add(new Comment(comment, 
          DateFormat.getDateTimeInstance().format(resultdate), userId)); 
        adapter.notifyItemInserted(data.size()); 
       } 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

我得到每一個鍵值對(除了總數),除了它不按預期順序(按鍵排序)。 Firebase文檔說,如果不能將它們解析爲32位整數,則按鍵按照字典順序排列。

無論哪種方式,儘管順序應該如圖所示,但我通過地圖循環獲取的數據不是按此順序。

我真的很感激,如果有人能指出我在正確的方向。謝謝!

+0

是什麼數據看起來像你回來爲了防止這種情況,你應該使用DataSnapshot.getChildren()方法?你可否請更新你的原始文章,包括這個?謝謝 –

回答

7

當你執行一個查詢你三樣東西:

  • 他們鍵
  • 這些

之間的相對順序當轉換結果爲Map它只能容納其中的兩個,所以訂單丟失了。在操作列表

Query query = locationComment.orderByKey(); 
query.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     if (dataSnapshot.getValue() == null) { 
      return; 
     } 
     data.clear(); 
     for (DataSnapshot child : dataSnapshot.getChildren()) { 
      ... 
     } 
     adapter.notifyDataSetChanged(); 
    } 

另見火力地堡文檔在這個例子:https://firebase.google.com/docs/database/android/lists-of-data#listen_for_value_events

1

看起來像你的數據結構嚴重不足。

Firebase具有鍵控的內部方式,Firebase只能訂購這些鍵,並且需要額外的條件。但由於您的密鑰是自定義密鑰,因此Firebase不能也不會訂購此分支。

的解決方法是調整你的數據以有意義的方式,這樣

+ comments 
    + total: 13 
    + data: 
    + 12uoasjihdou3 
     + time: xx 
     + userID: xx 
     + comment: xx 
    + 123tjiueoi134 
    + 1piahf9hasheui 
    + 6890324890oiuwer 

始終使用推()來生成新的密鑰,創建列表自定義鍵,那是一個總沒有去

FirebaseDatabase.getReference("comments").child("data").push({yourdata}); 

,如果您想訂購你的數據,你這是怎麼做到這一點

FirebaseDatabase.getReference("comments").child("data").orderByChild("time");