【问题标题】:Don't want to save data if it already exists in core data如果数据已存在于核心数据中,则不想保存数据
【发布时间】:2021-11-26 13:23:51
【问题描述】:

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

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

}

【问题讨论】:

  • 您是在谈论用新值更新已经存在的对象(练习)吗?还有DayExcersice有什么关系,你贴出来的fetch方法好像跟贴出来的save方法没有关系?
  • 每当我将值保存在数据库中时,我都会复制相同的值。例如,如果我调用 save 函数,那么每次都保存 id 和 name @JoakimDanielson
  • 是的,但是你试图做什么,目的是什么?
  • 如果一个值一旦存储在数据库中,那么该值又不会保存在数据库中@JoakimDanielson
  • 然后在保存之前检查该id是否存在于获取列表中。

标签: ios swift core-data


【解决方案1】:

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

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.
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多