保存在coredata -Swift之前检查数据是否存在

保存数据时,检查实体中是否已存在数据。 这里的问题是上面的方法没有按预期工作,当我第一次运行应用程序时,它显示的数据已经存在。 请检查以下代码,并阐明一些问题。 谢谢。

func someEntityExists(id: String, entityName: String, type : String, fieldName : String) -> Bool { let fetchRequest = NSFetchRequest(entityName: entityName) if type == "String"{ fetchRequest.predicate = NSPredicate(format: "\(fieldName) == %@", id) }else{ fetchRequest.predicate = NSPredicate(format: "\(fieldName) == %d", id) } var results: [NSManagedObject] = [] do { results = try self.persistentContainer.viewContext.fetch(fetchRequest) } catch { print("error executing fetch request: \(error)") } return results.count > 0 } 

下面是调用此函数来保存用户信息的代码。

  func saveUserInfo(detail:[String:Any])-> Bool { let context = self.persistentContainer.viewContext var isSave : Bool = false let entity = NSEntityDescription.entity(forEntityName: "User", in: context) let newUser = NSManagedObject(entity: entity!, insertInto: context) newUser.setValue(detail["id"], forKey: "id") newUser.setValue(detail["api_token"], forKey: "api_token") newUser.setValue(detail["username"], forKey: "username") newUser.setValue(detail["email"], forKey: "email") if let category = detail["firstname"] as? String { newUser.setValue(detail["firstname"], forKey: "firstname") } if let category = detail["middlename"] as? String { newUser.setValue(detail["middlename"], forKey: "middlename") } if let category = detail["lastname"] as? String { newUser.setValue(detail["lastname"], forKey: "lastname") } do { let isExist = someEntityExists(id: newUser.value(forKey: "email") as! String , entityName: "User", type: "String", fieldName: "email") if isExist == true { // don't save anything print("Data is already present ") }else{ try context.save() isSave = true } } catch { print("Failed saving") isSave = false } return isSave } 

首先,在调用someEntityExists之前,在托管上下文中创建一个User对象,因此即使尚未保存,该对象也很可能会包含在fetch中。

甚至在创建新用户实体之前调用someEntityExists以查看是否应该继续

 func saveUserInfo(detail:[String:Any])-> Bool { if someEntityExists(id: detail["email"] , entityName: "User", type: "String", fieldName: "email") { print("Data is already present") return false } //else create and save new user }