Check data exist before saving in coredata -Swift

笑着哭i 提交于 2019-12-04 06:10:28

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!