Comment voulez-vous mettre à jour une CoreData entrée qui a déjà été enregistré dans Swift?
Je ne suis pas sûr de ce que je fais mal ici, mais lorsque j'enregistre la première fois dans coredata, il fonctionne très bien. Lorsque j'essaie de l'écraser, il ne le fait pas.
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")
*/
Charger Les Données De Connexion Func
la fonction qui appelle sur saveLogin données
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
}
}
Vous devez vous connecter pour publier un commentaire.
Depuis batchupdate est plus utile dans les grandes quantités de données, je pense que c'est une approche plus subtile.
J'ai essayé de traduire un peu de votre situation, si je ne me trompe pas, mais ne l'ai pas testé.
fetchRequest.predicate
fondamentalement définit le filtre sur l'attributuserName
de l'entitéLoginData
, avec l' (utilisateur)nom que vous entrez lors de l'appel de la fonction. En supposant que dans cet exemple, vous avez un seulusername
avec le même nom. Puis il fait unfetchrequest
avec le filtre donné, de sorte que vous pouvez changer la valeur avecsetValue
avec leaccesToken
vous saisissez également lors de l'appel de la fonction. Le code après:if fetchResults.count != 0
, exécute uniquement lorsque leusername
existe.context.executeFetchRequest(...)
.Mis à jour pour Swift 4 & XCode 9.2
Pour répondre à votre question...
Vous devez d'abord obtenir une référence à votre
AppDelegate
etviewContext
. Ensuite, vous devez configurer unNSFetchRequest
pour l'Entité que vous êtes à la recherche pour mettre à jour, dans mon exemple, qu'il serait "d'Alerte". Ensuite, vous configurez votre chercher pour trouver le résultat que vous recherchez. Dans l'exemple, mon résultat trouvé des Alertes par leur date de création et le type d'alerte.À plus de lire la procédure de requête à l'aide d'un prédicat.
Débordement De Pile Dans L'Exemple &
La Documentation D'Apple
Je puis
context.fetch(fetchRequest)
, définir les résultats à la valeur que j'ai voulu mettre à jour, et traitées avec des erreurs dans un try catch.Enfin, Je
context.save()
.Swift >= 2 la méthode retourne maintenant un non-facultative et déclenche une erreur dans l'erreur de cas, qui doivent être manipulés avec try-catch:
newManagedObject.save()
après les paramètres les valeurs, correct?Vous êtes à la création de plusieurs nouveaux
LoginData
objets, mais votreloadLoginData
méthode est toujours retourner le même objet, la première de la demande de récupération des résultats.Vous souhaitez conserver la mise à jour de l'objet de même, si vous avez besoin de changer votre
saveLoginDetails
méthode.Au lieu de créer un nouvel objet (qui est ce que
insertNewObjectForEntityName
) n', utilisez leloadLoginDetails
méthode pour obtenir votre existant, et de modifier la propriété sur il.bonne chance
Il y a une nouvelle fonctionnalité appelée Mises à jour par Lot.
Je pense que cet article va vous aider à:
http://www.bignerdranch.com/blog/new-in-core-data-and-ios-8-batch-updating/
Bref ce que vous faire est d'utiliser la
NSBatchUpdateRequest
au lieu deNSFetchRequest
, filtrer les résultats avecNSPredicate
, modifiez la valeur dans les résultats, et d'enregistrer les données.Un autre tutoriel dans swift:
http://code.tutsplus.com/tutorials/ios-8-core-data-and-batch-updates--cms-22164
Il a travaillé pour moi, vous devriez essayer ceci:
Il a travaillé pour moi, vous devriez essayer ceci:
Cela a fonctionné pour moi. J'ai d'abord définir un filtre par l'attribut "nom_tâche" avec fetchRequest.prédicat. Puis-je récupérer les données déjà été enregistré et la valeur réglée pour "statut" pour mettre à jour l'objet.