webentwicklung-frage-antwort-db.com.de

Wie verwende ich die Firebase-Abfrage equalTo (Wert, Schlüssel)?

Als Neuling in Firebase habe ich versucht, eine Art "where-Klausel" -Anforderung zu simulieren, um die Geldbörse des Benutzers in diesem einfachen Anwendungsfall abzurufen:

User
   48bde8f8-3b66-40bc-b988-566ccc77335c
      email: "[email protected]"
      username: "userTest1"

UserWallet
   F4PvtvNT2Z
      coins: 26
      someList
         elemet1
         elemet2 
      user: "48bde8f8-3b66-40bc-b988-566ccc77335c"

Zuerst habe ich versucht, meine Anfrage so zu kodieren:

Firebase root = new Firebase("https://myApp.firebaseio.com/");
Firebase ref = root.child("UserWallet");
Query query = ref.equalTo("48bde8f8-3b66-40bc-b988-566ccc77335c", "user");

Das Ergebnis war null, also schrieb ich diese Abfrage:

Query query = ref.orderByChild("user").equalTo("48bde8f8-3b66-40bc-b988-566ccc77335c", "user");

Ergebnis war wieder null. Die einzige Möglichkeit, die Brieftasche abzurufen, war mit dieser Abfrage:

Query query = ref.orderByChild("user").equalTo("48bde8f8-3b66-40bc-b988-566ccc77335c");

Muss ich also immer die en "orderByChild ()" - Abfrage verwenden, bevor Sie "equalTo ()" verwenden können? 
Und was ist der Zweck der Abfrage "equalTo (String value, String key)" vergleiche mit "equalTo (String value), da nur der zweite korrekt funktioniert?

16
ThierryC

Es gibt einige Edge-Fälle, die keine orderBy...() benötigen. Im Allgemeinen benötigen Sie jedoch orderBy...(), bevor Sie eine Filterung durchführen (equalTo(), startAt(), endAt()).

Ich empfehle Ihnen dringend, zuerst die Firebase-Programmieranleitung für Android zu lesen (95% davon gilt auch für normales Java). Ein paar Stunden, die Sie in diesem Leitfaden verbracht haben, sparen hier Dutzende von Fragen. Zum Beispiel: Dies ist der Abschnitt zu Abfragen .

Nachdem Sie dies gelesen haben, möchten Sie möglicherweise auch diese Anleitung unter NoSQL Data Modeling lesen. Es deckt viele gängige Muster in der NoSQL-Datenmodellierung ab und hilft Ihnen frühzeitig zu erkennen, dass der Versuch, SQL-Abfragen einer NoSQL-Datenbank zuzuordnen, eine logische, aber selten gute Idee ist.

Mein anfängliches Modell (ohne eine Ahnung von Ihren Anwendungsfällen, außer "Ich muss die Brieftaschen für einen Benutzer finden können"):

UserWallet
   "48bde8f8-3b66-40bc-b988-566ccc77335c"
      "F4PvtvNT2Z"
         coins: 26
         someList
            element1
            element2 

Im obigen Modell habe ich Wallet und User unter UserWallet invertiert, so dass das Auffinden der Brieftaschen für einen Benutzer einfacher wird.

ref.child('UserWallet').child(auth.uid).addValueEventListener(...

Beachten Sie, dass es hier keine Abfrage gibt. Das Laden ist gleich schnell, unabhängig davon, wie viele Benutzer Sie in Ihrer Datenbank haben.

Oder alternativ:

User
   "48bde8f8-3b66-40bc-b988-566ccc77335c"
      email: "[email protected]"
      username: "userTest1"

Wallet
   "F4PvtvNT2Z"
      coins: 26
      someList
         element1
         element2 

UserWallet
   "48bde8f8-3b66-40bc-b988-566ccc77335c"
      "F4PvtvNT2Z"

Nun haben wir die Struktur komplett abgeflacht. Um die Brieftaschen eines Benutzers zu ermitteln, wechseln Sie zu UserWaller/$uid und laden dann jede Brieftasche aus Wallets/$walletid. Es kann etwas mehr Code sein, aber es ist äußerst effizient (da keine Abfragen erforderlich sind).

8

Sie können dafür eine verschachtelte Abfrage verwenden.! Wenn Sie mehrere zufällige IDs haben, können Sie diese leicht vergleichen.! DatabaseReference reference = FirebaseDatabase.getInstance (). GetReference ();

    Query query = reference.child("user");
    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                // dataSnapshot is the "issue" node with all children with id 0
                for (DataSnapshot issue : dataSnapshot.getChildren()) {
                    // do something with the individual "issues"

Query query = reference.child("user").child(dataSnapshot.getKey().equals(YourData)));
    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {






                }

            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
0
Atif AbbAsi