保存在coredata -Swift之前检查数据是否存在 [英] Check data exist before saving in 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屋!