如果数据已经存在于核心数据中,则不想保存数据

Don't want to save data if it already exists in core data

我能够从 Core Data 保存和检索数据,但我不知道如何不复制或避免在 Core 中保存相同的数据 Data.i 我正在复制相同的值,但我不知道想要在核心数据中保存相同的值(如果它已经存在)。我不知道在保存时要检查什么代码以防止复制它?

 func fetchDbdata(){
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let managedContext = appDelegate.persistentContainer.viewContext
    let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Day")
    do {
        let dayList = try managedContext.fetch(fetchRequest)
        for item in dayList{
            let id = item.value(forKeyPath: "id") as? String
            let name = item.value(forKey: "name") as? String
            print(name as Any)
        }
    }
    catch let error as NSError {
        print("\(error), \(error.userInfo)")
    }
}


func saveDaysList(id: String,name: String) {
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
    return
}
let managedContext = appDelegate.persistentContainer.viewContext
let entity = NSEntityDescription.entity(forEntityName: "Day", in: managedContext)!
let days = NSManagedObject(entity: entity, insertInto: managedContext)
days.setValue(id, forKey: "id")
days.setValue(name, forKey: "name")

do {
    try managedContext.save()
    daysData.append(days)
} catch let error as NSError {
    print("Could not save. \(error), \(error.userInfo)")
}

}

首先,应该创建 Day 实体的 CoreData class。控制起来会更方便

class Day: NSManagedObject {
    @NSManaged var id: String
    @NSManaged var name: String
}

处理 Core Data 中的重复问题有一个常见的场景。您应该首先在上下文中找到相同的项目。对我来说,大多数时候,我会先在缓存中找到该项目,如果前面的操作失败,运行 一个 NSFetchRequest 来获取它。

我可以给你一些示例方法。

public protocol Managed: class, NSFetchRequestResult {
    static var entity: NSEntityDescription { get }
    static var entityName: String { get }
}

extension Managed where Self: NSManagedObject {
    public static func materializedObject(in context: NSManagedObjectContext, matching predicate: NSPredicate) -> Self? {
        for object in context.registeredObjects where !object.isFault {
            guard let result = object as? Self, predicate.evaluate(with: result) else { continue }
            return result
        }
        return nil
    }

    public static func fetch(in context: NSManagedObjectContext, configurationBlock: (NSFetchRequest<Self>) -> () = { _ in }) -> [Self] {
        let request = NSFetchRequest<Self>(entityName: Self.entityName)
        configurationBlock(request)
        return try! context.fetch(request)
    }

    public static func findOrFetch(in context: NSManagedObjectContext, matching predicate: NSPredicate) -> Self? {
        guard let object = materializedObject(in: context, matching: predicate) else {
            return fetch(in: context) { request in
                request.predicate = predicate
                request.returnsObjectsAsFaults = false
                request.fetchLimit = 1
            }.first
        }
        return object
    }
}

extension Day: Managed {

}

使用 findOrFetch 方法您可以尝试找到重复项。如果找到该项目,则不应创建新项目。否则,您可以向数据库中插入一个新项目。

假设id是唯一的属性,查找代码如下:

let predicate = NSPredicate(format: "id=%@", "your id value")
if let object = Day.findOrFetch(in: context, matching: predicate) {
    // update your old item here.
} else {
    // insert your new item here.
}