¿Cómo se actualiza una input CoreData que ya se ha guardado en Swift?

No estoy seguro de qué estoy haciendo mal aquí, pero cuando guardo la primera vez en conetworkingata, funciona bien. Cuando trato de sobrescribir eso, no funciona.

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.shanetworkingApplication().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") */ 

Cargar datos de inicio de session Funciona la function que llama a los datos saveLogin

 func loadLoginData() -> String? { var appDel: AppDelegate = (UIApplication.shanetworkingApplication().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 } } 

Dado que el batchupdate es más útil en grandes trozos de datos, creo que este es un enfoque más sutil.

 func saveLoginData(accessToken: String, userName: String) { var appDel: AppDelegate = (UIApplication.shanetworkingApplication().delegate as AppDelegate) var context: NSManagedObjectContext = appDel.managedObjectContext! var fetchRequest = NSFetchRequest(entityName: "LoginData") fetchRequest.pnetworkingicate = NSPnetworkingicate(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) } } } 

Intenté traducirlo un poco a su situación si no me equivoco, pero no lo he probado.

fetchRequest.pnetworkingicate básicamente establece el filter en el atributo userName de la entidad LoginData, con el nombre (usuario) que ingresa al llamar a la function. Suponiendo que en este ejemplo solo tiene un nombre de usuario con el mismo nombre. Luego realiza una request de búsqueda con el filter dado, por lo que puede cambiar su valor con setValue con el accesoToken que también ingresa al llamar a la function. el código después: si fetchResults.count! = 0, solo se ejecuta cuando existe el nombre de usuario

Swift> = 2 el método ahora devuelve un no opcional y arroja un error en el caso de error, que debe manejarse con try-catch:

  let context = self.fetchedResultsController.managedObjectContext let entity = self.fetchedResultsController.fetchRequest.entity! let fetchRequest = NSFetchRequest(entityName:entity.name!) fetchRequest.pnetworkingicate = NSPnetworkingicate(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)") } 

Está creando múltiples objects LoginData nuevos, pero su método loadLoginData siempre devuelve el mismo object, el primero de los resultados de request de captura.

Desea mantener actualizando el mismo object, por lo que debe cambiar el método saveLoginDetails .

En lugar de crear un object nuevo (que es lo que insertNewObjectForEntityName ), use el método loadLoginDetails para get el existente y cambie la propiedad allí.

Hay una nueva function llamada Actualizaciones por lotes.

Creo que este artículo te ayudará:

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

Básicamente, lo que hace es utilizar NSBatchUpdateRequest lugar de NSFetchRequest , filtrar los resultados con NSPnetworkingicate , cambiar el valor en los resultados y save los datos.

Otro tutorial en swift:

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

  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")} 

buena suerte