如果数据已经存在于核心数据中,则不想保存数据
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.
}
我能够从 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.
}