2016-08-09 12 views
0

Ich entwickle eine Anwendung für Android, die Firebase verwendet. Die Anwendung hat Benutzer und jeder Benutzer hat Freunde.Wie bekomme ich eine Liste von Knoten mit ihrem Schlüssel

users: { 
    one: { 
    name: Mark, 
    friends: { 
     two: true, 
     three: true 
    }, 
    two: { 
    name: Carl 
    }, 
    three: { 
    name: Gustav 
    } 
} 

In diesem Beispiel hat Mark zwei Freunde (Carl und Gustav), die anderen beiden haben keine Freunde.

Ich möchte eine Freundesliste von Mark erhalten.

String userId = "one"; 
    DatabaseReference friendsDb = db.getReference("users").child(userId).child("friends"); 
    final DatabaseReference usersDb = db.getReference("users"); 

    ValueEventListener friendsListener = new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      GenericTypeIndicator<LinkedHashMap<String,Boolean>> t = new GenericTypeIndicator<LinkedHashMap<String,Boolean>>() {}; 
      LinkedHashMap<String,Boolean> tDataset = dataSnapshot.getValue(t); 

      users.clear(); 
      for(String userId : tDataset.keySet()) { 
       usersDb.child(userId).addListenerForSingleValueEvent(
         new ValueEventListener() { 
          @Override 
          public void onDataChange(DataSnapshot dataSnapshot) { 
           User user = dataSnapshot.getValue(User.class); 
           // how to return the user??? 
           // users.add(user); 

          } 
         }); 
      } 

      mAdapter.notifyDataSetChanged(); 
     } 

    }; 
    friendsDb.addValueEventListener(friendsListener); 

Benutze ich einen korrekten Ansatz bezüglich Datenmodellierung und Indizes? Wie soll es mir die Benutzerliste zurückgeben, die ich brauche?

Ich verstehe, dass es eine asynchrone Operation ist, auf eine Ressource zu hören, gibt es eine Möglichkeit, die Werte zu erhalten, die ich auf einmal brauche?

Jede Hilfe wird geschätzt! Vielen Dank!

EDIT

Lösung von Frank van Puffelen vorgeschlagen ist es richtig in das Konzept aber nicht richtig umgesetzt wird. Das Konzept besteht darin, das mAdapter.notifyDataSetChanged(); wenn alle Kinder von Firebase db abgerufen wurden. Aber es muss die Dimension des ersten Snapshot, Intad der Sekunde, wie folgt überprüfen.

 DatabaseReference friendsDb = db.getReference("users").child(userId).child("friends"); 
    final DatabaseReference usersDb = db.getReference("users"); 

    ValueEventListener friendsListener = new ValueEventListener() { 
     @Override 
     public void onDataChange(final DataSnapshot dataSnapshot) { 
      GenericTypeIndicator<HashMap<String,Boolean>> t = new GenericTypeIndicator<HashMap<String,Boolean>>() {}; 
      HashMap<String,Boolean> tDataset = dataSnapshot.getValue(t); 

      final int usersSize = tDataset.size(); 

      users.clear(); 
      for(String userId : tDataset.keySet()) { 
       usersDb.child(userId).addListenerForSingleValueEvent(
         new ValueEventListener() { 
          @Override 
          public void onDataChange(DataSnapshot dataSnapshot) { 
           User user = dataSnapshot.getValue(User.class); 
           users.add(user); 
           if (users.size() == usersSize) { 
            mAdapter.notifyDataSetChanged(); 
           } 
          } 
         }); 
      } 
     } 
    }; 
    friendsDb.orderByKey().addValueEventListener(friendsListener); 

Antwort

0

Es gibt keine Firebase Äquivalent SQLs WHERE id IN (1,2,3). Leistungsmäßig wird das nicht benötigt, da Firebase pipelines the requests.

Ihr Code sieht gut aus, außer dass Sie den Benutzer nicht zur Liste hinzufügen. Ich erwarte, dass Sie Probleme haben, die "Ausgangsbedingung" für diese Schleife zu definieren, die ist:

0

Versuchen Sie, Ihre Daten auf diese Weise arrangieren:

users: { 
    one: { 
     name: Mark 
    }, 
    two: { 
     name: Carl 
    }, 
    three: { 
     name: Gustav 
    } 
}, 
friends : { 
    Mark : { 
     two : true, 
     three : true 
} 
} 
+0

Dies löst nicht mein Problem über gleichzeitige Daten abrufen. Was sind die Vorteile Ihres Modells? In meinem Modell kann ich einfach die db-Berechtigung verwalten, um meine Daten zu sichern und den Zugriff nur auf die Daten zu garantieren, die dem angemeldeten Benutzer gehören. –

+0

Siehe [Best Practices für die Datenstruktur in Firebase] (https://firebase.google.com/docs/database/android/structure-data). –

+0

Ich sehe, dass Ihr Modell besser ist, wenn die App einen Benutzerknoten herunterlädt und die zusätzlichen Informationen über ihre Freundschaften nicht heruntergeladen werden muss. Auf jeden Fall erfordert Ihr Modell eine zusätzliche Sicherheitsrichtlinienregel in Firebase, damit ein Benutzer nur seinen Knoten im Zweig friends lesen kann. –

Verwandte Themen