2017-10-25 5 views
2

Ich habe zZ eine Funktion, die eine neue GoalItem zu meiner Firebase Datenbank einführt, wenn sie einer Tabellenansicht hinzugefügt wird.Doppelte Einträge in Firebase vermeiden

func save(_ goalItems: [GoalItem]) { 
    let ref = Database.database().reference() 
    let goalRef = ref.child("goals").childByAutoId() 

    for goalItem in goalItems { 
     let attributes = ["iconName": goalItem.iconName, "text": goalItem.text, "user": self.email] 
     goalRef.setValue(attributes) 
    } 

} 

Wenn jedoch ein Benutzer ihre ‚GoalItem‘ bearbeitet wird save es auch genannt wird, in der Sache entstandene dupliziert werden.

Im Wesentlichen, ich suche nach einer Möglichkeit, die Duplizierung des Eintrags zu vermeiden, wenn die text Eigenschaft der GoalItem auf die ‚Text‘ Referenz Datenbank anfänglich gleich ist, die ein Kind der ‚Ziele‘ Referenz.

Ich denke, so etwas wie:

if goalItem.text == (value of Firebase's text reference) { 
    (update the text reference) 
else { 
     goalRef.setValue 

die Datenbank Zugriff auf ‚Text‘ Referenz den Wert auf goalItem.text greifen und zu vergleichen, wo ich im Moment bin fallen. Die Struktur der Datenbank ist sehr einfach - Bild unten.

Datenbank

enter image description here

TLDR; Müssen Sie auf bestimmte Datenbank Kind Referenz zugreifen und aktualisieren (anstatt zu überschreiben)

Vielen Dank im Voraus!

Antwort

2

Hinweis dieser Zeile in Ihrer Sparfunktion:

let goalRef = ref.child("goals").childByAutoId() 

childByAutoId() ist, was die lange Reihe von zufälligen Zeichen erzeugt, die Ihr Objekt Ziel ausrichtet. Da Sie es bei update aufrufen, wird auch ein neues Zielobjekt erstellt.

Also, was Sie tun müssen, ist auf diese automatische ID für jedes vorhandene Ziel zu halten. Und wenn Sie ein bestimmtes Zielobjekt bearbeiten, sollte diese Referenz wie folgt lauten:

// assuming you have a goal object that holds onto its ID 
let goalRef = ref.child("goals").child(goal.id) 
+0

Vielen Dank! –