2016-12-11 2 views
0

Ok, donc je suis nouveau à CoreData et j'utilise NSNumber (environ un jour) et j'ai regardé un tutoriel sur CoreData et j'ai réussi à stocker un certain nombre de réalisations différentes dans coreData en utilisant la même entité que j'ai appelé "Achievement" mais maintenant j'essaye d'aller chercher les données sur la base d'un nom donné pour rechercher une "réalisation" spécifique et éditer son attribut.Données de base - Modifier, incrémenter et sauvegarder l'attribut à une entité déjà existante

func addOneToAchievement(AchName: String) { 

    let getDataRequest:NSFetchRequest<Achievement> = Achievement.fetchRequest() 
    getDataRequest.predicate = NSPredicate(format: "theSearchName == %@" , AchName) 

    do { 

     let searchResults = try CoreDatabaseContoller.getContext().fetch(getDataRequest) 

     //print("number of results: \(searchResults.count)") 

     for result in searchResults as [Achievement] { 

      // print("\(result.theName!) \(result.theDescription!) is \(result.theImage!) \(result.aAmount!)/\(result.aNeededAmount!) is \(result.aStage!)") 

      result.aAmount! += 1 

      if result.aAmount! == result.aNeededAmount { 

       result.theImage! = "diamonds2" 
       result.aNeededAmount! = 100 
       result.aStage! = 2 

      } 
     } 
    } 

    catch { 

     print("ERROR: \(error)") 

    } 
} 

Mais je rencontre un problème, pour l'attribut montant de mon entité est un NSNumber et ont trouvé que je ne peux pas augmenter par la syntaxe habituelle de

result.Amount! += 1 

Comment puis-je augmenter le NSNombre de résultat.Montant! puis sauvegarder avec tous les autres attributs que j'ai changé de cette réalisation certaine?

Répondre

1

Personnellement, j'ai toujours utiliser les types standard Swift Int pour les propriétés Core Data gérées. D'après mon expérience, les sous-classes NSManagedObject m'ont automatiquement fourni ceci, mais s'il génère NSNumber pour vous, il peut y avoir un moyen simple de le changer (je n'ai pas encore fait de Core Data dans Xcode 8).

Quoi qu'il en soit, NSNumber est juste une enveloppe autour d'un nombre, de sorte que vous pouvez obtenir la valeur réelle via intValue.

let amount = result.aAmount!.intValue 
a = NSNumber(value: amount + 1) 

Une fois que vous avez tout changé (à condition que les changements se sont produits sur NSManagedObject sous-classes et propriétés marquées @NSManged), vous pouvez enregistrer en appelant save() le contexte.

do { 
    try CoreDatabaseContoller.getContext().save() 
} catch { 
    // Error on Save 
} 
+0

Merci qui a fonctionné! :) – Astrum