You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase导入数据至TableView时如何避免同名客户单元格重复?

如何避免Firebase导入TableView时出现同名客户的重复单元格?

你现在碰到的问题很典型——同一个客户因为在Firebase里有多个子节点数据,导致TableView里生成了重复的单元格。先看看你的数据库结构和当前的TableView效果:

数据库结构

Firebase数据库结构

当前TableView显示结果

重复的客户单元格

问题出在哪?

看你提供的代码,现在的逻辑是遍历每个客户的子节点,每遍历一个就创建一个CustomerModel并添加到数组,所以同一个客户的多个子节点会生成多个重复的模型对象,TableView自然就显示重复项了。

解决方案:通过客户唯一ID去重

要解决这个问题,我们需要用客户的**唯一标识(比如ID字段,姓名可能重复,但ID肯定是唯一的)**来判断是否已经添加过该客户,避免重复插入数组。

修改后的代码如下:

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") 
    // 用字典记录已添加的客户ID,避免重复
    var addedCustomerIDs = [String: Bool]()
    // 先清空数组,防止新旧数据叠加重复
    self.candies.removeAll()
    self.filteredCandies.removeAll()
    
    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"] 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
            
            // 校验客户ID,已存在则跳过当前子节点
            guard let id = customerID, !addedCustomerIDs.keys.contains(id) else {
                continue
            }
            
            let myCustomer = CustomerModel(
                name: name, 
                phone: phone, 
                company: company, 
                customerID: id, 
                email: email, 
                nip: nip, 
                postal: postal, 
                street: street, 
                town: town
            ) 
            self.candies.append(myCustomer) 
            self.filteredCandies.append(myCustomer)
            // 标记该ID已添加
            addedCustomerIDs[id] = true
        } 
    } 
    self.tableViewCustomer.reloadData() 
})

关键修改点说明:

  1. 新增addedCustomerIDs字典:用来跟踪已经添加到数组中的客户ID,确保每个客户只被处理一次
  2. 提前清空数组:每次获取Firebase新数据时,先清空candies和filteredCandies,避免旧数据和新数据重复累加
  3. ID校验逻辑:在创建CustomerModel之前,先检查当前客户的ID是否已经存在于字典中,如果存在就跳过,否则才添加到数组并标记ID已存在

如果你的数据库中,同一个客户的不同子节点包含不同的信息(比如不同的联系方式),你可能还需要考虑合并这些信息(比如把多个电话合并到一个字段),但如果只是要显示客户姓名,上面的代码就足够让每个客户只显示一个单元格了。

内容的提问来源于stack exchange,提问作者Christopher Kolodziej

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:26:44