Sptibo
Sptibo

Reputation: 283

Update an object on core data swift 4

I have several items of jobs in core data entity whose jobId is -1. I need to fetch all those items and update jobId by proper ids which are in my object that is passed in updateMyJobs method. I haven't extracted NSManagedObject class to work on core data (i.e.- I've checked the entity as Class definition)

Here's my 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)")
    }
}

I passed some integer value and call the above method to update the item like this.

DatabaseHandler.shared.updateMyJobs(jobId: 222)

Error: Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unacceptable type of value for attribute: property = "jobId"; desired type = NSNumber; given type = Swift._NSContiguousString; value = 222.'

I'm trying to set new jobId to the related object in core data entity. Is it necessary to extract NSManagedObject Class or not. Please someone help me to do this. Thank You.

Upvotes: 2

Views: 18610

Answers (3)

Srinivasan_iOS
Srinivasan_iOS

Reputation: 1088

Update Object to core data

@IBAction func buttonUpdate(_ sender: Any) {
        let entity = NSEntityDescription.entity(forEntityName: "Students", in: managedContext)
        let request = NSFetchRequest<NSFetchRequestResult>()
        request.entity = entity
        let newName = UserDefaults.standard.value(forKey: "new") as! String
        let predicate = NSPredicate(format: "(name = %@)", newName)
        request.predicate = predicate
        do {
            let results =
                try managedContext.fetch(request)
            let objectUpdate = results[0] as! NSManagedObject
            objectUpdate.setValue(txtName.text!, forKey: "name")
            objectUpdate.setValue(txtPhone.text!, forKey: "phone")
            objectUpdate.setValue(txt_Address.text!, forKey: "address")
            do {
                try managedContext.save()
                labelStatus.text = "Updated"
            }catch let error as NSError {
              labelStatus.text = error.localizedFailureReason
            }
        }
        catch let error as NSError {
            labelStatus.text = error.localizedFailureReason
        }

    }

Upvotes: 1

Ilya Kharabet
Ilya Kharabet

Reputation: 4631

You need to set NSNumber instead of String. Replace this line:

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

with:

object.jobId = jobId

Upvotes: 0

vadian
vadian

Reputation: 285240

Please read the error message. It's very clear. In setValue you are passing a String (via String Interpolation) rather than expected Int or NSNumber

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

or

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

But the best and recommended way is dot notation

object.jobId = jobId

Upvotes: 5

Related Questions