我有一个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()
}
}
答案 0 :(得分:0)
我的建议是,使用' getKey'来存储用户的pushKey
。 push
用户详细信息时的方法。
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 node
和push()
。如下所示,
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()
}
}
我毫不怀疑可能有更好的方法。这是对我有用的最简单的事情。