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



我有一个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()
        }
    }

我的建议,在用户详细信息push时使用'getKey'方法存储用户的pushKey

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

现在您可以检索用户的"键"。假设您正在列出列表视图中的用户,并且要删除一行。

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

让我知道,是否有效。

更新:我不知道Swift。但是我会给你一个抽象的想法。
创建新学生时,您可以将student nodepush()右转。像下面一样,

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

然后您将数据放在

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

我做到了,使用上面的建议并尝试很多。方法工作的方法确实是捕获用户关键。

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和Row表格TableView的数据。

此答案将firebase删除幕后删除行为,以便 不要干扰正常的表观view加载机制。一 福利是减少了对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()
    }
  }

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

最新更新