问题
While saving the data am checking whether the data is already exist or not in the entity. Problem here is the above method is not working as expected, when I run the app for very first time it's showing data is already exist. Please check the below code and shed some light. Thanks.
func someEntityExists(id: String, entityName: String, type : String, fieldName : String) -> Bool {
let fetchRequest = NSFetchRequest<NSManagedObject>(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
}
Below is the code where am calling this function to save the user information.
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
}
回答1:
First you create a User object in your managed context before calling someEntityExists
so most likely this object will be included in the fetch even if it hasn't been saved yet.
Call someEntityExists
before even creating a new user entity to see if you should proceed or not
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
}
来源:https://stackoverflow.com/questions/51403783/check-data-exist-before-saving-in-coredata-swift