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

时间:2018-03-09 17:06:02

标签: ios swift core-data

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

Json格式

MAX_PROCESSES

enter image description here 当我拿取显示重复值的“名字”

enter image description here

这些是保存和获取代码

{
    "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"
                }
        }
  ]
}

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

2 个答案:

答案 0 :(得分:2)

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

为避免重复从Core Data获取所有联系人,请将其映射到名称并检查数组是否包含收到的名称

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

注意:

  • 使用通用提取请求进行核心数据提取会返回始终 NSManagedObject子类的非可选数组,该数组在成功时指定为通用类型。< / LI>
  • 从不使用foo.count > 0检查空数组,使用!foo.isEmpty
  • Swift 3+中的JSON字典总是[String:Any]而不是[String:AnyObject]
  • 处理dataTask完成块中的潜在错误。
  • 将完成块中的第一个参数命名为小写(data),以避免与Data类型混淆。
  • 忽略options中的jsonObject(with参数,因为结果显然是一个集合类型。

答案 1 :(得分:0)

也许可以对fetch请求执行类似于How to get distinct results from a single field in Core Data (Swift 4)的操作,但另一种选择是通过简单地从获取结果创建一个集来删除重复项:

let fetchSet = Set(fetchResults)

并迭代整个集合