Friday, August 24, 2018

Overwrite on Core Data value

hello I need to overwrite value on CoreData if already is. For example if already on CoreData I have Josh I need to delete this and next save new Josh

func save(value:String, forkey:String) {
    let context = getContext()
    let entity = NSEntityDescription.entity(forEntityName: "Lastname", in: context)

    let add = NSManagedObject(entity: entity!, insertInto: context)
    add.setValue(value, forKey: forkey)

    do {
        try context.save()
        print("save ->  \(value)")
    } catch {
        print("err \(error)")
    }
}

Solved

  • Fetch the object.
  • Create a new object if there is none.
  • Update the attributes.
  • Save the context.

func save(value:String, for key:String) {
    let context = getContext()
    let request = NSFetchRequest(entityName: "Lastname")
    let predicate = NSPredicate(format:"%K == %@", value, key)
    request.predicate = predicate
    do {
       let fetchResults = try context.executeFetchRequest(request)
       let object : NSManagedObject 
       if fetchResults.isEmpty {
          let entity = NSEntityDescription.entity(forEntityName: "Lastname", in: context)
          object = NSManagedObject(entity: entity!, insertInto: context)
       } else }
          object = fetchResults[0]
       }

       object.setValue(value, forKey: key)

       try context.save()
       print("save ->  \(value)")
    } catch {
        print("err \(error)")
    }
}

Note: I'm not using Swift 2 anymore, a compiler error might occur.


We can check whether values are there or not. Then update and Create values in database

class func checkAndUpdateAtIndex(entry_id: String, comment_text: String, comment_name: String, comment_pic: String, comment_date: String, comment_id: String, comment_isDeleted: String, comment_userid: String) {
    let context: NSManagedObjectContext = DataAccess.shared.managedObjectContext
    let request = NSFetchRequest(entityName: "Comment")
    request.predicate = NSPredicate(format: "comment_id = %@", comment_id)

    if let fetchResults = (try? DataAccess.shared.managedObjectContext.executeFetchRequest(request)) as? [NSManagedObject] {
        if fetchResults.count != 0{
            //update value
            var managedObject = fetchResults as! [Comment]
            managedObject[0].setValue(entry_id, forKey: "entry_id")
            managedObject[0].setValue(comment_text, forKey: "comment_text")
            managedObject[0].setValue(comment_name, forKey: "comment_name")
            managedObject[0].setValue(comment_pic, forKey: "comment_pic")

        }else {  
            // create new entity if not found
            let newItems = NSEntityDescription.insertNewObjectForEntityForName("Comment", inManagedObjectContext: context) as! Comment

            newItems.entry_id = entry_id
            newItems.comment_text = comment_text
            newItems.comment_name = comment_name
            newItems.comment_pic = comment_pic            
        }


            do {
                try context.save()
            } catch {}
    }
}

In this Update method I'm firstly getting that entity which we want to update and then storing new values in that place.


No comments:

Post a Comment