Ben
Ben

Reputation: 791

core data update an existing object when it does exists

I created a table: key, value.

It's just for save some params, when the key doesn't exist, I do an insert but when it exist I update the value.

In my case, when the key already exist it does an another insert in ma table with key equal to nil:

public static func insertValueWithKey(context: NSManagedObjectContext, key:String, value:String){

    let fetchRequest : NSFetchRequest<NSFetchRequestResult>

    if #available(iOS 10.0, *) {
        fetchRequest = Params.fetchRequest()
    } else {
        fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Params")
    }

    let predicate = NSPredicate(format: "key=%@", key)
    fetchRequest.predicate = predicate

    do {
        let results = try context.fetch(fetchRequest)

        if(results.count != 0){

            let paramsDescription = NSEntityDescription.entity(forEntityName: "Params", in: context)


            let params = NSManagedObject(entity: paramsDescription!, insertInto: context) as! Params


            params.value = value

            do {
                try context.save()
            } catch let error as NSError {
                print ("Error first demande insertion \(error)")
            }

        } else if (results.count == 0) {

            let params = NSEntityDescription.insertNewObject(forEntityName: "Params", into: context) as! Params

            params.key = key
            params.value = value

            context.insert(params)

            do {
                try context.save()
            } catch let error as NSError {
                print ("Error first demande insertion \(error)")
            }
        }


    } catch {
        let fetchError = error as NSError
        print(fetchError)
    }

}

I don't understand why because it work as well on simulator but not on device...

Upvotes: 3

Views: 3038

Answers (1)

Jon Rose
Jon Rose

Reputation: 8563

replace:

    let params = NSManagedObject(entity: paramsDescription!, insertInto: context) as! Params

with

    let params = results.last as! Params

NSManagedObject(entity: insertInto:) is functionally the same as NSEntityDescription.insertNewObject(forEntityName:into:)

Upvotes: 1

Related Questions