保存在coredata -Swift之前检查数据是否存在 [英] Check data exist before saving in coredata -Swift

查看:103
本文介绍了保存在coredata -Swift之前检查数据是否存在的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

}


推荐答案

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

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.

甚至在创建新用户权利之前调用 someEntityExists 是否要继续

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
}

这篇关于保存在coredata -Swift之前检查数据是否存在的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆