2016-08-08 36 views
1

CONTEXT:Filterung nach Enkeln Eigenschaft in Feuerbasis [in android]

Hallo, ich arbeite derzeit an einem Android-Projekt von Firebase unterstützt.

Ich habe eine denormalisierte Datenstruktur eingerichtet, die polls mit users (Viele-zu-viele-Beziehung) über votes verbindet. Hier ist ein Bild, das den votes Pfad meiner Datenbank anzeigt. Die Struktur ist wie folgt:

Stimmen -> [pollUid] -> [votePushuid] -> Abstimmung Objekt

enter image description here

So wir in diesem Beispiel eine einzige Umfrage, die 4 Stimmen hat.

Ich möchte überprüfen, ob ein Benutzer bereits über eine Umfrage abgestimmt hat. Um dies zu tun, hole ich die UmfragenUid, dann durchlaufen Sie seine Abstimmungen, um zu sehen, ob einige von ihnen die voterUid -Eigenschaft == zu ihrer Benutzer-UID enthalten.

Dies geschieht wie folgt:

FirebaseHandler.getInstance().getMainDatabaseRef() 
         .child(FirebaseConstants.VOTES) //votes root 
         .child(pollKey) //polluid 
         .orderByChild("voterUid") 
         .equalTo(FirebaseHandler.getInstance().getUserUid()) 
         .limitToFirst(1) 
         .addListenerForSingleValueEvent(new ValueEventListener() { 
          @Override 
          public void onDataChange(DataSnapshot dataSnapshot) { 
           if(!dataSnapshot.exists()) { 

Wenn die datasnaptshot existiert dann wissen wir, dass der Benutzer bereits bei dieser Umfrage abgestimmt hat und es in der Java-Logik umgehen können.

PROBLEM:

Die datasnapshot von onDataChange empfangen ist immer null (dh nicht vorhanden ist), wenn für eine bestimmte Benutzer-Abstimmung über eine bestimmte Umfrage zu suchen. Ich weiß für eine Tatsache, dass die Abstimmung in der DB durch die Überprüfung der Daten vorhanden ist, und dass die userUid über das Debuggen korrekt ist. Das Entfernen der equalTo und limitToFirst gibt alle Stimmen für die Abstimmung ohne ein Problem zurück, so klar ist der Stamm des Verweises korrekt. Dies bedeutet für mich, dass das Problem durch eine der beiden oben genannten Methoden verursacht wird. Noch seltsamer ist die Tatsache, dass dieser Ansatz zu bestimmten Zeiten funktioniert, aber nicht zu anderen.

FRAGE: Wie gebe ich eine Liste der Firebase gespeicherten Objekte zurück, die durch eine Enkeleigenschaft gefiltert werden? Wenn dies nicht möglich ist, was wäre die geeignetere Datenstruktur für dieses Problem?

Auf eine weitere Anmerkung Ich habe Menschen gesehen, die den Ansatz der Verwendung von Query anstelle von Datenbankreferenzen. Vielleicht hat das etwas mit dem aktuellen Problem zu tun.

Antwort

1

Ihre Anfrage ist korrekt. Ich habe kein Problem, diese Abfrage mit meiner eigenen DB auszuführen. Es ist wahrscheinlich, dass die userId nicht übereinstimmt. DatabaseReference erweitert Query, deshalb können Sie auf die Methoden von Query zugreifen.

würde eine Datenbankstruktur alternative

sein
{ "users_votes": { 
     "<userId>": { 
      "<pollId1>" : true, 
      "<pollId2>" : true, 
      "<pollId3>" : true 
     } 
    } 
} 

den Wert zu diesem Knoten Set, sobald der Benutzer auf eine Umfrage abgestimmt.

Um zu überprüfen, ob der Benutzer für eine Umfrage

usersVotesRef.child(FirebaseHandler.getInstance().getUserUid()) 
    .child(pollKey).addListenerForSingleValueEvent(valueEventListener); 
gestimmt hat,