2016-08-30 3 views
2

Ich verwende derzeit Firebase, um die Daten von Personen und einige Details über sie zu speichern. Dies ist, wie ich die Details aus der Datenbank abrufen meine Tableview zu füllen:Löschen von Knoten aus Firebase von TableView

let ref = FIRDatabase.database().reference().child("Users") 
    ref.observeEventType(.ChildAdded, withBlock: 
    { (snapshot) in 

     if let firstname = snapshot.value?.objectForKey("firstname"), lastname = snapshot.value?.objectForKey("lastname") 
     { 
      let fullname = "\(firstname) \(lastname)" 
      self.names.append(fullname) 
      self.tableView.reloadData() 
     } 

    }, withCancelBlock: nil) 

Jeder meiner Benutzer ihre eigene eindeutige ID hat, und ich versuche, sie zu, dass nach löschen. Bisher habe ich meine Benutzer löschen nur aus dem Tableview Ende und nicht aus der Datenbank:

override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) 
{ 
    if editingStyle == .Delete 
    { 
     names.removeAtIndex(indexPath.row) 
     tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) 

     //Delete from firebase 
    } 
} 

In meinem observePeople() -Funktion implementiert ich den Code zu beobachten, wenn ein Kind wie so entfernt wird:

ref.observeEventType(.ChildRemoved, withBlock: 
    { (snapshot) in 

    if let firstname = snapshot.value?.objectForKey("firstname"), lastname = snapshot.value?.objectForKey("lastname"), dateOfBirth = snapshot.value?.objectForKey("Date of Birth"), zipcode = snapshot.value?.objectForKey("Zipcode") 
    { 
     print("We deleted the person \(firstname) \(lastname) with the details: \(dateOfBirth), \(zipcode)") 
    } 

    }, withCancelBlock: nil) 

Also, wie kann ich den genauen Benutzer anhand ihrer ID löschen, wenn jemand sie mit einem Swipe aus dem TableView löscht?

Antwort

1

Sie können die Methode removeValue() an der Referenz verwenden, an der Sie den Benutzer löschen möchten.

Also in Ihren commitEditingStyle Tabellenansicht Verfahren, in dem Sie //Delete from firebase geschrieben ist, wo man so etwas wie einfügen könnte:

ref.child("Users/\(uniqueUserID)").removeValue() 

Sie müßten die uniqueUserID für den Benutzer an den indexPath.row, die Sie in Ihrer Tabelle gelöscht bekommen Aussicht.

Ich kann detaillierter gehen, wenn Sie ein Beispiel eingeben, wie Ihre JSON-Struktur für Ihre Benutzer aussieht.

Ist es ungefähr so?

"root" 
    "Users" 
     "uniqueUserID" 
      "firstname" 
      "lastname" 
      "dateOfBirth" 
      "zipcode" 

EDIT Wenn Ihr Wörterbuch aussieht, was oben ich so etwas tun würde:

In ref.observeEventType(.ChildAdded:

//names will be the array that stores the user data that you retrieve from Firebase 
//names will be an array of dictionaries 
//each dictionary will represent a user object that includes firstname, lastname, AND uniqueUserID 
self.names = [[String : AnyObject]]()//make a new clean array 
//create a dictionary to store the user data 
let user = snapshot.value as! [String: AnyObject] 
//get the uniqueUserID which is the `snapshot.key` 
let uniqueUserID = snapshot.key as! String 
//add the uniqueUserID to the user dictionary 
user["uniqueUserID"] = uniqueUserID as! String 
self.name.append(user) 
self.tableView.reloadData() 

In der commitEditingStyle Tabellenansicht Methode, wo Sie //Delete from firebase schrieb:

//get the user at the `index.row` in the names array 
let user: [String: AnyObject] = self.names[indexPath.row] 
let uniqueUserID = user["uniqueUserID"] 
//get the uniqueUserID 
let ref = FIRDatabase.database().reference() 
//remove that user at that uniqueUserID 
ref.child("Users/\(uniqueUserID)").removeValue() 
+0

ja genau so sieht der baum aus –

0

Ich konnte den Schlüssel des Snapshots finden, der die eindeutige ID des Benutzers ist, indem er die vollständigen Namen abgleicht. Ich habe jedoch einen Fehler, wo nach dem Löschen eines Elements löscht es den Index danach, bis ich zu einem Element übrig und ich bekomme den "Index außerhalb des Bereichs Fehler".

let ref = FIRDatabase.database().reference().child("Users") 
     ref.observeEventType(.ChildAdded, withBlock: { (snapshot) in 

      if let firstname = snapshot.value?.objectForKey("firstname"), lastname = snapshot.value?.objectForKey("lastname") 
      { 
       let fullname = "\(firstname) \(lastname)" 
       let currentName = self.names[indexPath.row] 

       if fullname == currentName 
       { 
        print("We have a match") 
        let currentKey = snapshot.key 
        ref.child(currentKey).removeValue() 

        dispatch_async(dispatch_get_main_queue()) 
        { 
         self.tableView.reloadData() 
        } 
       } 

      } 

     }, withCancelBlock: nil) 
Verwandte Themen