如何更新已经保存在Swift中的CoreData条目?

我不确定我在这里做错了什么,但是当我第一次保存到coredata时,它工作得很好。 当我试图覆盖,它不。

func testStuff() { var token = loadLoginData() println("Token \(token)") saveLoginData("New Token") var newToken = loadLoginData() println("Token \(newToken)") } func saveLoginData(accessToken: String) { var appDel: AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate) var context: NSManagedObjectContext = appDel.managedObjectContext! // save data to core data var loginData = NSEntityDescription.insertNewObjectForEntityForName("LoginData", inManagedObjectContext: context) as NSManagedObject loginData.setValue(accessToken, forKey: "accessToken") context.save(nil) println("Done saving user") } /* Output Token Optional("12345") Done saving user Token Optional("12345") */ 

加载login数据Func调用saveLogin数据的函数

 func loadLoginData() -> String? { var appDel: AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate) var context: NSManagedObjectContext = appDel.managedObjectContext! var request = NSFetchRequest(entityName: "LoginData") request.returnsObjectsAsFaults = false var results: NSArray = context.executeFetchRequest(request, error: nil)! if (results.count > 0) { var userData: NSManagedObject = results[0] as NSManagedObject var accessToken: String = userData.valueForKey("accessToken") as String return accessToken.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) } else { println("0 results returned, potential error") return nil } } 

由于batchupdate在更大的数据块中更有用,我认为这是一个更为微妙的方法。

 func saveLoginData(accessToken: String, userName: String) { var appDel: AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate) var context: NSManagedObjectContext = appDel.managedObjectContext! var fetchRequest = NSFetchRequest(entityName: "LoginData") fetchRequest.predicate = NSPredicate(format: "userName = %@", userName) if let fetchResults = appDel.managedObjectContext!.executeFetchRequest(fetchRequest, error: nil) as? [NSManagedObject] { if fetchResults.count != 0{ var managedObject = fetchResults[0] managedObject.setValue(accessToken, forKey: "accessToken") context.save(nil) } } } 

如果我没有弄错,我试图把它翻译成你的情况,但是没有经过testing。

fetchRequest.predicate基本上在实体LoginData上设置了属性userName的filter,并在调用函数时使用您input的(用户)名称。 假设在这个例子中,你只有一个用户名相同。 然后它使用给定的filter执行fetchrequest,所以您可以使用setValue在调用函数时使用accesToken来更改它的值。 后面的代码:if fetchResults.count!= 0,只有当用户名存在时才执行

Swift> = 2该方法现在返回一个非可选的,并在错误情况下引发错误,必须用try-catch来处理:

  let context = self.fetchedResultsController.managedObjectContext let entity = self.fetchedResultsController.fetchRequest.entity! let fetchRequest = NSFetchRequest(entityName:entity.name!) fetchRequest.predicate = NSPredicate(format: "notificationId = 13") do { let list = try context.executeFetchRequest(fetchRequest) as? [NSManagedObject] if list!.count == 0 // Check notificationId available then not save { let newManagedObject = NSEntityDescription.insertNewObjectForEntityForName(entity.name!, inManagedObjectContext: context) newManagedObject.setValue("This is first message13", forKey: "message") newManagedObject.setValue(1, forKey: "appId") newManagedObject.setValue(13, forKey: "notificationId") newManagedObject.setValue("First one", forKey: "tital") } // success ... } catch let error as NSError { // failure print("Fetch failed: \(error.localizedDescription)") } 

您正在创build多个新的LoginData对象,但是您的loadLoginData方法总是返回相同的对象,这是获取请求结果中的第一个对象。

你想不断更新同一个对象,所以你需要改变你的saveLoginDetails方法。

而不是创build一个新的对象(这是什么insertNewObjectForEntityName ),使用loadLoginDetails方法来获得您现有的,并更改那里的属性。

  var context:NSManagedObjectContext = appDel.managedObjectContext! var en = NSEntityDescription.entityForName("ENTITIES_NAME", inManagedObjectContext: context) let batchUpdateRequest = NSBatchUpdateRequest(entity: en!) batchUpdateRequest.resultType = NSBatchUpdateRequestResultType.UpdatedObjectIDsResultType batchUpdateRequest.propertiesToUpdate = ["OBJECT_KEY": "NEWVALUE"] var batchUpdateRequestError: NSError? context.executeRequest(batchUpdateRequest, error:&batchUpdateRequestError) if let error = batchUpdateRequestError {println("error")} 

祝你好运

有一个称为批量更新的新function。

我认为这篇文章将帮助你:

http://www.bignerdranch.com/blog/new-in-core-data-and-ios-8-batch-updating/

NSBatchUpdateRequest你所做的就是使用NSBatchUpdateRequest而不是NSFetchRequest ,用NSPredicate过滤结果,更改结果中的值并保存数据。

另一个快速教程:

http://code.tutsplus.com/tutorials/ios-8-core-data-and-batch-updates–cms-22164