Firebase:从行中删除项目(Swift 3)

时间:2016-12-09 18:41:24

标签: uitableview firebase swift3

我有一个tableview,显示来自Firebase控制台(JASON结构)的数据,如下所示:

chklst-xxx
     - avaliation
         -students
              -KHZAjBi44eZ8JsaswkKI
                -teacher: Paul 
                -datTime: 09.12.2016  12:25pm
                -name: Mary Anne
                -mark: 7.5 
                -preceptor: John 
              -KHWZlh7aasy78ahsiuKIi0
                -teacher: Paul 
                -datTime: 09.12.2016  12:48pm
                -name: Anne Caroline
                -mark: 9.4 
                -preceptor: Peter

这些数据显示在一个桌面视图中,每个都在节点学生之后,除了密钥。我有一个函数来删除特定的行,就像我在CoreData中的其他应用程序(tableview editingStyle)一样:

// FUNC DELETAR
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
        teste.remove(at: indexPath.row)
        ref.removeValue() // HERE IS MY DOUBT
        tableView.reloadData()
    }
}

我可以从数组和表格中删除该项目,但我不知道如何从Firebase中执行此操作。我已经尝试过removeValue的其他方法,但它只是没有用,除了一种擦除整个数据的方法,而不是特别选择的行。

let ref = FIRDatabase.database().reference().child("avaliation").child("students")

我需要一些教学来使这项工作。谢谢。

以下是我保存此数据的方法:(已添加09.12 19:30 pm)

func Save(){
    let ref = FIRDatabase.database().reference().child("avaliation").child("students").childByAutoId()
    referencia.child(“name”).setValue(Name)
    referencia.child(“teacher”).setValue(Teacher)
    referencia.child("preceptor").setValue(Preceptor)
    referencia.child("datTime”).setValue(DateTime)
    referencia.child(“mark”).setValue(ResultComFReFC)
}

这是我使用主数组的类:

import Foundation
import Firebase

struct ChkList {
var name: String?
var teacher: String?
var preceptor: String?
var DateToday: String?
var mark: String?
var key: String!

init(name: String, teacher: String, preceptor: String, mark: String, DateToday: String, key: String = "") {
    self.name = name
    self.teacher = teacher
    self.preceptor = preceptor
    self.mark = mark
    self.DateToday = DateToday
    self.key = key
}


init(snapshot: FIRDataSnapshot) {
    key = snapshot.key
    let snapshotValue = snapshot.value as! [String: AnyObject]
    name = snapshotValue["name"] as? String
    teacher = snapshotValue["teacher"] as? String
    preceptor = snapshotValue["preceptor"] as? String
    mark = snapshotValue["mark"] as? String
    DateToday = snapshotValue["DateToday"] as? String
}

func toAnyObject() -> Any {
    return [
        "name": name,
        "teacher": teacher,
        "preceptor": preceptor,
        "mark": mark,
        "DateToday": DateToday   ]}}

更新:Tableview EdityingStyle

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

  if editingStyle == .delete {
let ref = FIRDatabase.database().reference().child("avaliation").child("students").childByAutoId()
teste.remove(at: indexPath.row) //Array delet item
      let userKeyA = ref.key
      ref.child(userKeyA).removeValue()
      tableView.reloadData()
        }
    }

3 个答案:

答案 0 :(得分:0)

我的建议是,使用' getKey'来存储用户的pushKeypush用户详细信息时的方法。

chklst-xxx
 - avaliation
     -students
          -KHZAjBi44eZ8JsaswkKI
            -teacher: Paul 
            -userKey:KHZAjBi44eZ8JsaswkKI <--------------
            -datTime: 09.12.2016  12:25pm
            -name: Mary Anne
            -mark: 7.5 
            -preceptor: John

现在您可以检索用户的&#39;键。假设您在列表视图中列出了用户,并希望删除一行。

let ref = FIRDatabase.database().reference().child("avaliation").child("students").child(students.getUserKey()).removeValue();

如果有效,请告诉我。

更新:我不太了解。但我会给你一个抽象的想法 当您创建新学生时,请引用student nodepush()。如下所示,

DatabaseReference studentsRef = FIRDatabase.database().reference().child("avaliation").child("students").push();

然后你把你的数据,

studentRef.child("teacher").setValue("Paul");
studentRef.child("userKey").setValue(studentRef.getKey()); <------------

答案 1 :(得分:0)

我做到了,使用上面的建议,并且学习和尝试了很多。 该方法的工作方式是捕获用户密钥。

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

if editingStyle == .delete {

        let user: ChkList = teste[indexPath.row]
        let uk = user.key
        print("Userkey: \(uk)")
        ref.child(uk!).removeValue()
}
}

这样您就可以从Firebase和行表格视图中删除数据。

答案 2 :(得分:0)

  

此答案会在后台移动Firebase删除行为   不干扰正常的tableview加载机制。一   好处是减少了对Firebase和删除的调用次数   来自内部tableview动画过程的计时问题。

对我来说有用的是将Firebase的东西放在一边。在我的情况下,我收集了我想要的所有密钥。在删除过程中,我从本地对象中删除了值,离开场景后,我从viewDidDisappear()调用我的清理方法,将更新的数据同步回Firebase:

func syncFavorites() {
    //ref is the leaf for the favorites
    //clear existing
    ref?.removeValue()
    //temp collection
    var faves = [String:Any]()
    //dataArrayKeys is my collection of keys on self
    dataArrayKeys.keys.forEach { (key) in
      faves.updateValue("true", forKey: key)
    }
    ref?.updateChildValues(faves)
  }

我使用常规方法处理tableview's删除操作。

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
      // Delete the row from the data source
      if let key = dataArr[indexPath.row]["key"] as? String {
        dataArrayKeys.removeValue(forKey: keyToDelete)
        dataArr.remove(at: indexPath.row)
      }
      tableView.deleteRows(at: [indexPath], with: .fade)
      self.tableView.reloadData()
    }
  }

我毫不怀疑可能有更好的方法。这是对我有用的最简单的事情。