代码之家  ›  专栏  ›  技术社区  ›  naga

swift中具有重复实体值的核心数据

  •  0
  • naga  · 技术社区  · 7 年前

    我正在解析Json中的一些数据并将其保存到coredata中,在将核心数据提取到tableview中后显示工作正常,tableview正在重复显示所有值中如何避免重复值我尝试了很多方法,但没有找到方法

    Json格式

    {
        "contacts": [
            {
                    "id": "c200",
                    "name": "Ravi Tamada",
                    "email": "ravi@gmail.com",
                    "address": "xx-xx-xxxx,x - street, x - country",
                    "gender" : "male",
                    "phone": {
                        "mobile": "+91 0000000000",
                        "home": "00 000000",
                        "office": "00 000000"
                    }
            },
            {
                    "id": "c201",
                    "name": "Johnny Depp",
                    "email": "johnny_depp@gmail.com",
                    "address": "xx-xx-xxxx,x - street, x - country",
                    "gender" : "male",
                    "phone": {
                        "mobile": "+91 0000000000",
                        "home": "00 000000",
                        "office": "00 000000"
                    }
            },
            {
                    "id": "c202",
                    "name": "Leonardo Dicaprio",
                    "email": "leonardo_dicaprio@gmail.com",
                    "address": "xx-xx-xxxx,x - street, x - country",
                    "gender" : "male",
                    "phone": {
                        "mobile": "+91 0000000000",
                        "home": "00 000000",
                        "office": "00 000000"
                    }
            }
      ]
    }
    

    enter image description here 当我获取显示重复值的“name”时

    enter image description here

    这些是保存和获取代码

    func getfetchdata()
    {
    
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Contacts")
    
    
        do{
            let fetchResults = try self.context.fetch(fetchRequest) as? [Contacts]
        if fetchResults!.count > 0 {
    
            for bEntity in fetchResults! {
    
                let employeeEntity =  bEntity
    
                print(employeeEntity.name as Any)
    
                TableviewData.append(ContactsDataVal.init(name: employeeEntity.name!,
                                                          id: employeeEntity.id!, email: employeeEntity.email!, gender: employeeEntity.gender!, address: employeeEntity.address!))
    
            }
    
          print("data values already")
    
            }}
        catch let error as NSError
        {
            print(error)
        }
    }
    func getdata()
    {
    
        let url = URL(string: "https://api.androidhive.info/contacts/")
    
        URLSession.shared.dataTask(with: url!) { (Data, response, error) in
           do
            {
                let data = try JSONSerialization.jsonObject(with: Data!, options: JSONSerialization.ReadingOptions.allowFragments)as! [String:AnyObject]
    
                let arraydata = data["contacts"]as! [[String:Any]]
    
    
                for arravalues in arraydata
                {
    
                    let entityDescription = NSEntityDescription.entity(forEntityName: "Contacts", in:self.context)
    
                    let favouriteObj = Contacts(entity: entityDescription!, insertInto: self.context)
    
                    favouriteObj.name = arravalues["name"] as? String
    
                    favouriteObj.id = arravalues["id"] as? String
    
                    favouriteObj.email = arravalues["email"] as? String
    
                    favouriteObj.gender = arravalues["gender"] as? String
    
                    favouriteObj.address = arravalues["address"] as? String
    
                    do {
                        try self.context.save()
                    }
    
                }
    
            }catch let error as NSError{
    
                print("error",error)
            }
        }
            .resume()
      }
    

    如何避免核心数据中的重复值,并在tableview中显示正确的数据

    2 回复  |  直到 7 年前
        1
  •  2
  •   vadian    7 年前

    首先在 getdata 不要在循环的每次迭代中保存上下文,请在循环后保存一次。

    为了避免重复,请从核心数据中提取所有联系人,将其映射到名称,并检查数组是否包含收到的名称

    func getdata()
    {
    
        let url = URL(string: "https://api.androidhive.info/contacts/")
        let names : [String]
        do {
            let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Contacts")
            let fetchResults = try self.context.fetch(fetchRequest)
            names = fetchResults.map{ $0.name }
        } catch {
            names = []
        }
    
        URLSession.shared.dataTask(with: url!) { (data, response, error) in
            if error != nil { print(error!); return }
            do {
                let data = try JSONSerialization.jsonObject(with: data!) as! [String:Any]
                let arraydata = data["contacts"] as! [[String:Any]]
                for arravalues in arraydata
                {
                    guard let name = arravalues["name"] as? String, !names.contains(name) else { continue }
                    let entityDescription = NSEntityDescription.entity(forEntityName: "Contacts", in:self.context)
                    let favouriteObj = Contacts(entity: entityDescription!, insertInto: self.context)
                    favouriteObj.name = name
                    favouriteObj.id = arravalues["id"] as? String
                    favouriteObj.email = arravalues["email"] as? String
                    favouriteObj.gender = arravalues["gender"] as? String
                    favouriteObj.address = arravalues["address"] as? String
                }
                try self.context.save()
            } catch {
                print("error",error)
            }
        }
        .resume()
    }
    

    备注:

    • 使用通用fetch请求返回的核心数据获取 总是 非可选 的数组 NSManagedObject 成功时指定为泛型类型的子类。
    • 从不 使用检查空数组 foo.count > 0 使用 !foo.isEmpty
    • Swift 3+中的JSON字典总是 [String:Any] 而不是 [String:AnyObject]
    • 处理中的潜在错误 dataTask 完成区块。
    • 将完成块中的第一个参数命名为小写( data )避免与类型混淆 Data
    • 省略 options 中的参数 jsonObject(with 因此,显然是一种集合类型。
        2
  •  0
  •   Joakim Danielson    7 年前

    可能可以对fetch请求执行类似的操作 How to get distinct results from a single field in Core Data (Swift 4) 但另一种选择是,只需从获取结果中创建一个集合,即可删除重复项:

    let fetchSet = Set(fetchResults)
    

    并在集合上迭代