【问题标题】:Firebase duplicate cellFirebase 重复单元格
【发布时间】:2018-05-22 12:13:58
【问题描述】:

在将客户从数据库导入表格视图期间,是否可以避免重复具有相同名称内容的单元格?在我的示例中,如果客户 Ben Smith 有两个孩子的值,我只想要一个带有他名字的单元格。

这是我的数据库结构...

并在tableview中产生:

let userID = Auth.auth().currentUser!.uid
    let usersDatabaseRef = Database.database().reference().child("usersDatabase").child(userID).child("Customers")
    usersDatabaseRef.observe(.value, with: { snapshot in
        print("there are \(snapshot.childrenCount) users")
        for child in snapshot.children {
            let childSnap = child as! DataSnapshot
            print("user: \(childSnap.key)")
            let userCustomerSnap = childSnap
            for customer in userCustomerSnap.children.allObjects as! [DataSnapshot] {
                let customerSnap = customer
                let dict = customerSnap.value as! [String: Any]
                let name = dict["Name and surname"]
                let phone = dict["Phone"]
                let company = dict["Company name"]
                let customerID = dict["ID"]
                let email = dict["Email"]
                let nip = dict["Nip1"]
                let postal = dict["Postal code"]
                let street = dict["Street"]
                let town = dict["Town"]
                let myCustomer = CustomerModel(name: name as? String, phone: phone as? String, company: company as? String, customerID: customerID as? String, email: email as? String, nip: nip as? String, postal: postal as? String, street: street as? String, town: town as? String)
                self.candies.append(myCustomer)
                self.filteredCandies.append(myCustomer)
            }
            self.tableViewCustomer.reloadData()

【问题讨论】:

  • 请分享您的代码
  • @Khushbu 更新发送
  • 在你的欲望循环中试试这个:for customer in userCustomerSnap.children.first
  • @ΒασίληςΔ。 children.first 里面是什么(哪里:???)
  • 请分享您的表格视图代码。

标签: swift uitableview firebase firebase-realtime-database


【解决方案1】:

每次您从该客户处找到订单(或“Ben Smith”下在您的数据中代表的任何级别)时,您都会向列表中添加一个项目。因此,您的列表是订单列表,而不是客户列表。

一般来说,在 NoSQL/Firebase 中,建议为您的数据库建模以实现您想要显示的内容。所以如果你想要一个客户列表,这就是我存储在数据库中的内容。但是鉴于你的数据结构,你也可以在代码中修复它:

usersDatabaseRef.observe(.value, with: { snapshot in
    print("there are \(snapshot.childrenCount) users")
    for child in snapshot.children {
        let childSnap = child as! DataSnapshot
        let myCustomer = CustomerModel(name: child.key, phone: "", company: "", customerID: "", email: "", nip: "", postal: "", street: "", town: ")
        self.candies.append(myCustomer)
        self.filteredCandies.append(myCustomer)
    }

    self.tableViewCustomer.reloadData()
})

或者,仅当新客户的姓名与您看到的先前订单不同时才添加新客户:

var previousName: String = ""
usersDatabaseRef.observe(.value, with: { snapshot in
    print("there are \(snapshot.childrenCount) users")
    for child in snapshot.children {
        let childSnap = child as! DataSnapshot
        print("user: \(childSnap.key)")
        let userCustomerSnap = childSnap
        for customer in userCustomerSnap.children.allObjects as! [DataSnapshot] {
            let customerSnap = customer
            let dict = customerSnap.value as! [String: Any]
            let name = dict["Name and surname"]
            if name != previousName {
                let phone = dict["Phone"]
                let company = dict["Company name"]
                let customerID = dict["ID"]
                let email = dict["Email"]
                let nip = dict["Nip1"]
                let postal = dict["Postal code"]
                let street = dict["Street"]
                let town = dict["Town"]
                let myCustomer = CustomerModel(name: name as? String, phone: phone as? String, company: company as? String, customerID: customerID as? String, email: email as? String, nip: nip as? String, postal: postal as? String, street: street as? String, town: town as? String)
                self.candies.append(myCustomer)
                self.filteredCandies.append(myCustomer)
                previousName = name
            }
        }
    }
    self.tableViewCustomer.reloadData()

【讨论】:

  • 谢谢!你让我开心!
【解决方案2】:

你真的不需要那个 for 循环。这可能是导致您出现问题的原因。无论如何,该代码被调用的次数与您有孩子的次数相同,因此您不需要该循环。试试下面的代码。如果这不起作用,您可能需要尝试.childAdded 而不是.value

guard let userID = Auth.auth().currentUser?.uid else { return }
let usersDatabaseRef = Database.database().reference().child("usersDatabase").child(userID).child("Customers")
usersDatabaseRef.observe(.childAdded, with: { snapshot in

    guard let dict = snapshot.value as? [String: Any] else { return }

    let name = dict["Name and surname"] as? String
    let phone = dict["Phone"] as? String
    let company = dict["Company name"] as? String
    let customerID = dict["ID"] as? String
    let email = dict["Email"] as? String
    let nip = dict["Nip1"] as? String
    let postal = dict["Postal code"] as? String
    let street = dict["Street"] as? String
    let town = dict["Town"] as? String

    let myCustomer = CustomerModel(name: name, phone: phone, company: company, customerID: customerID, email: email, nip: nip, postal: postal, street: street, town: town)

    self.candies.append(myCustomer)

    self.filteredCandies.append(myCustomer)

    DispatchQueue.main.async {
        self.tableViewCustomer.reloadData()
    }

}, withCancel: nil)

【讨论】:

  • 此代码在我的表格视图中仅显示一个空单元格 - 它不起作用...
  • @KrzysztofŁowiec 使用 .childAdded 而不是使用 .value
  • 现在我有四个空单元格 - 这是正确的数字,但仍然是空的
猜你喜欢
  • 1970-01-01
  • 2016-09-23
  • 2019-11-10
  • 1970-01-01
  • 2019-07-11
  • 2015-01-22
  • 1970-01-01
  • 2014-11-04
  • 2020-08-01
相关资源
最近更新 更多