2016-06-24 4 views
1

In meiner App gibt es eine Aktivität, die beim Klicken auf die Schaltfläche Speichern, 2 Sätze von Daten in 2 verschiedenen Orten von push() gemacht werden, Da an beiden Orten ein Unikat ID wird benötigt.Firebase, zweite push() in der gleichen Methode funktioniert nicht

Ich habe den Beispielcode in der Firebase Führung gefolgt und hinzugefügt, um den zweiten Schub

String userId = auth.getCurrentUser().getUid().toString(); 
DatabaseReference reference = FirebaseDatabase.getInstance().getReference(); 
DatabaseReference firstDatabaseRef = reference.child("first"); 
DatabaseReference secondDatabaseRef = reference.child("second").child(userId); 



String key = firstDatabaseRef.child(userId).push().getKey(); 
First first = new First(firstAmount,key,firstName); 
Map<String, Object> firstValues = first.toMap(); 


String keySecond = secondDatabaseRef.child(key).push().getKey(); 
Second second = new Second(secondName,secondAmount,keySecond,key); 
Map<String, Object> secondValue = second.toMap(); 

Map<String, Object> childUpdates = new HashMap<>(); 
childUpdates.put("/first/" + userId + "/" + key, firstValues); 
childUpdates.put("/second/" + userId + "/" + key + "/" + keySecond, secondValue); 
reference.updateChildren(childUpdates); 

Das Ergebnis, das ich für first bekam, war genau so, wie ich aber für second erwartet, statt second/<userId>/<key>/<keySecond>/children zu schaffen, erhalte ich diese :

"second" : { 
    //userId 
    "5TQLPlGf4mbcBRKesQwR30fH1L22" : { 
     //key 
     "-KL1030IywlNpkTGC7mU" : { 
     "secondAmount" : "147", 
     "Key" : "-KL1030IywlNpkTGC7mU", 
     "secondName" : "secondName", 
     "keySecond" : "-KL1030PZlHqD_asSR_8", 
     } 
    } 
} 

Statt die letzten Kinder in einer anderen eindeutigen ID zu haben, die durch die Art und Weise in den keySecond aufgezeichnet ist, sie sind alle direkt mit dem Schlüssel hinzugefügt. Dies kann nicht akzeptiert werden, da alle key viele keySecond haben müssen. Ich hoffe, dass ich mein Problem richtig erklärt habe. Bitte sag mir was ich falsch mache. Wie soll ich meinen Code ändern oder sollte ich meine Datenstruktur komplett überdenken?

Antwort

0

Bei der Verarbeitung der updateChildren() Schleife die Firebase-Datenbank Schleifen über die Kinder, die Sie übergeben und für jeden Schlüssel im Wesentlichen eine setValue() mit dem Wert, den Sie bestanden.

Das bedeutet, wenn Sie Kinder mit überlappenden Schlüsseln haben, wird der Wert eines dieser Schlüssel zuletzt geschrieben. Die Reihenfolge ist nicht definiert.

In Ihrem Fall ist es ziemlich einfach, das Updates zu verschmelzen:

String key = firstDatabaseRef.child(userId).push().getKey(); 
First first = new First(firstAmount,key,firstName); 
Map<String, Object> firstValues = first.toMap(); 

String keySecond = secondDatabaseRef.child(key).push().getKey(); 
Second second = new Second(secondName,secondAmount,keySecond,key); 
Map<String, Object> secondValue = trans.toMap(); 
firstValues.put(keySecond, secondValue); // This is the main change 

Map<String, Object> childUpdates = new HashMap<>(); 
childUpdates.put("/first/" + userId + "/" + key, firstValues); 
reference.updateChildren(childUpdates); 
+0

Ich schätze wirklich Ihre schnelle Antwort. Ich habe getan, was Sie vorgeschlagen haben, aber trotzdem bekomme ich genau die gleichen Ergebnisse. – Ramtin

+0

@Frank: Ich denke, Ihre Lösung behebt ein Problem, das nicht existiert. Die zwei Kinder von 'childUpdates' sind auf' first' und 'second' verwurzelt. Ihre Werte überschneiden sich nicht, oder? –

+0

Ah, richtig .... guter Fang! Das habe ich völlig übersehen. Zurück zum Scannen der Hashmaps ist es ... –

2

Dies ist ein Puzzle. Ich kopiere den Code, den du gepostet hast, und habe Stubs für First und Second erstellt. Das Ausführen mit Firebase 9.0.2 ergab das unten gezeigte Ergebnis, was ich glaube, was Sie erwarten. Laufen Sie mit einer anderen Firebase-Version? Ist es möglich, dass der von Ihnen gepostete JSON mit einer anderen Version des von Ihnen geposteten Codes erstellt wurde?

{ 
    "first" : { 
    // userId 
    "ypx8RB3eglTBRPeUT7laQVQ1PZQ2" : { 
     // key 
     "-KL3rXeYrscFQNrVQnHb" : { 
     "firstAmount" : "FirstAmount", 
     "firstKey" : "-KL3rXeYrscFQNrVQnHb", 
     "firstName" : "FirstName" 
     } 
    } 
    }, 
    "second" : { 
    // userId 
    "ypx8RB3eglTBRPeUT7laQVQ1PZQ2" : { 
     // key 
     "-KL3rXeYrscFQNrVQnHb" : { 
     // keySecond 
     "-KL3rXe_JyY9Vz2U-NES" : { 
      "Key" : "-KL3rXeYrscFQNrVQnHb", 
      "keySecond" : "-KL3rXe_JyY9Vz2U-NES", 
      "secondAmount" : "SecondAmount", 
      "secondName" : "SecondName" 
     } 
     } 
    } 
    } 
} 
+0

Vielen Dank für Ihre Antwort. Sorry für den Tippfehler, ich habe es behoben. Ich benutze die gleiche Version von Firebase, die 9.0.2 ist und ich habe sogar den Code mit mehreren Benutzern ausprobiert. Wenn Sie mit dem Code die richtigen Ergebnisse erzielt haben, kann das Problem durch etwas anderes verursacht werden. – Ramtin

+0

wieder muss ich dir für deine antwort danken, obwohl ich immer noch keine ahnung habe, warum ich dieses ergebnis bekommen habe, ich habe ein ähnliches projekt mit dem exakt gleichen code nachgebaut und jetzt funktioniert es. Ich war wirklich ein Rätsel. – Ramtin

Verwandte Themen