Firebase дубликат ячейки - PullRequest
0 голосов
/ 22 мая 2018

Можно ли избежать дублирования ячейки с одноименным содержимым при импорте клиента из базы данных в таблицу?В моем примере, если у клиента Бена Смита есть двое детей со значениями, мне нужна только одна ячейка с его именем.

Это моя структура базы данных ...

enter image description here

И результат в виде таблицы:

enter image description here

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()

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Вы добавляете элемент в список каждый раз, когда находите заказ (или какой-либо уровень в разделе «Бен Смит», представленный в ваших данных) от этого клиента.Таким образом, ваш список - это список заказов, а не список клиентов.

Как правило, в 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()
0 голосов
/ 22 мая 2018

Вам действительно не нужно это для цикла.Это может быть то, что вызывает у вас проблемы.Код вызывается столько же раз, сколько у вас детей, так что вам не нужен этот цикл.Попробуйте код ниже.Если это не сработает, вам, возможно, придется попробовать .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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...