我有一个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 node
和push()
右转。像下面一样,
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()
}
}
我毫不怀疑可能有更好的方法。这是对我有用的最简单的事情。