2017-02-23 8 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

これらのうちの2つしか保持できないため、順序が失われます。リストでの作業にFirebaseのドキュメントで、この例を参照してください。また

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はこれらのキーを注文することができます。しかし、あなたのキーはカスタムキーなので、ファイアベースはこのブランチを注文できません。

ソリューションは常に、が総なしのthats、リストのカスタムキーを作成しない新しいキーを生成するためにプッシュ()を使用し、この

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

のように、意味のある方法でデータを再構築することですあなたのデータを注文したい場合は、これはあなたが行う方法です

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

行くこと

あなたは Mapそれに結果を変換すると、それらのキー
  • これら
  • 間の相対的な順序

    • :あなたは3つのことを取得するクエリを実行
    関連する問題