web-dev-qa-db-fra.com

Mettre à jour un objet sur des données de base Swift 4

J'ai plusieurs postes de travail dans l'entité de données principale dont le jobId est -1. J'ai besoin d'extraire tous ces éléments et de mettre à jour le jobId en utilisant les identifiants appropriés figurant dans mon objet et passés dans la méthode updateMyJobs. Je n'ai pas extrait la classe NSManagedObject pour travailler sur des données de base (c'est-à-dire que j'ai vérifié l'entité en tant que définition de classe)

Voici mon code:

func updateMyJobs(jobId: Int){
    managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "DBJobsNearBy")
    fetchRequest.predicate = NSPredicate(format: "jobId = '-1'")
    let result = try? managedObjectContext.fetch(fetchRequest)
    let resultData = result as! [DBJobsNearBy]
    for object in resultData {
        print(object.jobId)
        if object.jobId == -1 {
            object.setValue("\(jobId)", forKey: "jobId")
        }
    }
    do {
        try managedObjectContext.save()
        print("saved!")
    } catch let error as NSError  {
        print("Could not save \(error), \(error.userInfo)")
    }
}

J'ai passé une valeur entière et appeler la méthode ci-dessus pour mettre à jour l'élément comme ceci.

DatabaseHandler.shared.updateMyJobs(jobId: 222)

Erreur: application en raison de l'exception non interceptée 'NSInvalidArgumentException', raison: 'Type de valeur inacceptable pour attribut: property = "jobId"; type souhaité = NSNumber; type donné = Swift._NSContiguousString; valeur = 222. '

J'essaye de définir le nouveau jobId sur l'objet associé dans l'entité de données principale. Est-il nécessaire d'extraire NSManagedObject Class ou non? S'il vous plaît, aidez-moi à le faire. Je vous remercie.

2
Sptibo

Veuillez lire le message d'erreur. C'est très clair. Dans setValue, vous passez une String (via une interpolation de chaîne) plutôt que prévu Int ou NSNumber

object.setValue(jobId, forKey: "jobId")

ou 

object.setValue(NSNumber(value: jobId), forKey: "jobId")

Mais la meilleure façon recommandée est la notation par points

object.jobId = jobId
4
vadian

Vous devez définir NSNumber au lieu de String. Remplacez cette ligne:

object.setValue("\(jobId)", forKey: "jobId")

avec:

object.jobId = jobId
0
Ilya Kharabet