ios 如何更新已保存在 Swift 中的 CoreData 条目?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/26345189/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-31 03:10:26  来源:igfitidea点击:

How do you update a CoreData entry that has already been saved in Swift?

ioscore-dataswift

提问by slooker

I'm not sure what I'm doing wrong here, but when I save the first time into coredata, it works just fine. When I try to overwrite that, it doesn't.

我不确定我在这里做错了什么,但是当我第一次保存到 coredata 时,它工作得很好。当我尝试覆盖它时,它没有。

func testStuff() {
    var token = loadLoginData()
    println("Token \(token)")
    saveLoginData("New Token")
    var newToken = loadLoginData()
    println("Token \(newToken)")
}

func saveLoginData(accessToken: String) {
    var appDel: AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
    var context: NSManagedObjectContext = appDel.managedObjectContext!
    // save data to core data
    var loginData = NSEntityDescription.insertNewObjectForEntityForName("LoginData", inManagedObjectContext: context) as NSManagedObject
    loginData.setValue(accessToken, forKey: "accessToken")
    context.save(nil)
    println("Done saving user")
}

/* Output
Token Optional("12345")
Done saving user
Token Optional("12345")
*/

Load Login Data Func the function that calls on saveLogin data

Load Login Data Func调用saveLogin数据的函数

func loadLoginData() -> String? {
    var appDel: AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
    var context: NSManagedObjectContext = appDel.managedObjectContext!

    var request = NSFetchRequest(entityName: "LoginData")
    request.returnsObjectsAsFaults = false

    var results: NSArray = context.executeFetchRequest(request, error: nil)!
    if (results.count > 0) {
        var userData: NSManagedObject = results[0] as NSManagedObject
        var accessToken: String = userData.valueForKey("accessToken") as String

        return accessToken.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())

    } else {
        println("0 results returned, potential error")
        return nil
    }
}

回答by Henk-Martijn

Since batchupdate is more useful in larger chunks of data, I think this is a more subtle approach.

由于 batchupdate 在更大的数据块中更有用,我认为这是一种更微妙的方法。

func saveLoginData(accessToken: String, userName: String) {
    var appDel: AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
    var context: NSManagedObjectContext = appDel.managedObjectContext!

    var fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "LoginData")
    fetchRequest.predicate = NSPredicate(format: "userName = %@", userName)

    if let fetchResults = appDel.managedObjectContext!.executeFetchRequest(fetchRequest, error: nil) as? [NSManagedObject] {
        if fetchResults.count != 0{

            var managedObject = fetchResults[0]
            managedObject.setValue(accessToken, forKey: "accessToken")

            context.save(nil)
        }
    }
}

I tried to translate it a bit to your situation if I'm not mistaken, but have not tested it.

如果我没记错的话,我试着把它翻译成你的情况,但还没有测试过。

fetchRequest.predicatebasically sets the filter on the attribute userNamefrom the entity LoginData, with the (user)name you enter when calling the function. Assuming in this example you have only one usernamewith the same name. Then it does a fetchrequestwith the given filter, so you can change it's value with setValuewith the accesTokenyou also enter when calling the function. The code after: if fetchResults.count != 0, only executes when the usernameexists.

fetchRequest.predicate基本上是userName在实体的属性上设置过滤器LoginData,使用您在调用函数时输入的(用户)名称。假设在这个例子中你只有一个username同名的。然后,它确实fetchrequest与给定的过滤器,这样你就可以改变它的值setValueaccesToken调用函数时,你也进入。之后的代码:if fetchResults.count != 0,仅在username存在时执行。

回答by Devbot10

Updated for Swift 4 & XCode 9.2

为 Swift 4 和 XCode 9.2 更新

To answer your question...

要回答你的问题...

How do you update a CoreData entry that has already been saved in Swift?

如何更新已保存在 Swift 中的 CoreData 条目?

You first need to get a reference to your AppDelegateand viewContext. You then need to set up a NSFetchRequestfor the Entity you are looking to update, in my example that would be "Alert". You then set up your fetch to find the result you are looking for. In the example, my result found Alerts by their creation date and alert type.

您首先需要获得对您的AppDelegate和的引用viewContext。然后,您需要为NSFetchRequest要更新的实体设置一个,在我的示例中为“警报”。然后,您可以设置 fetch 以找到您要查找的结果。在示例中,我的结果是按创建日期和警报类型找到警报。

To further read how to query using a predicate. Stack Overflow Example& Apple Documentation

进一步阅读如何使用谓词进行查询。 堆栈溢出示例Apple 文档

I then context.fetch(fetchRequest), set the results to the value I wanted to update, and dealt with errors in a try catch. Finally I context.save().

然后context.fetch(fetchRequest),我将结果设置为我想要更新的值,并在 try catch 中处理错误。最后我context.save()

let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Alert")

fetchRequest.predicate = NSPredicate(format: "creationDate = %@ AND alertType = %&",
                                         argumentArray: [creationDate, alertType])

do {
    let results = try context.fetch(fetchRequest) as? [NSManagedObject]
    if results?.count != 0 { // Atleast one was returned

        // In my case, I only updated the first item in results
        results[0].setValue(yourValueToBeSet, forKey: "yourCoreDataAttribute")
    }
} catch {
    print("Fetch Failed: \(error)")
}

do { 
    try context.save() 
   }
catch {
    print("Saving Core Data Failed: \(error)")
}

回答by Mitul Marsoniya

Swift >= 2the method now returns a non-optional and throws an error in the error case, which must be handled with try-catch:

Swift >= 2该方法现在返回一个非可选值并在错误情况下抛出错误,必须使用 try-catch 处理:

    let context = self.fetchedResultsController.managedObjectContext
    let entity = self.fetchedResultsController.fetchRequest.entity!

    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName:entity.name!)
    fetchRequest.predicate = NSPredicate(format: "notificationId = 13")

    do {
        let list = try context.executeFetchRequest(fetchRequest) as? [NSManagedObject]
        if list!.count == 0 // Check notificationId available then not save
        {
            let newManagedObject = NSEntityDescription.insertNewObjectForEntityForName(entity.name!, inManagedObjectContext: context)
            newManagedObject.setValue("This is first message13", forKey: "message")
            newManagedObject.setValue(1, forKey: "appId")
            newManagedObject.setValue(13, forKey: "notificationId")
            newManagedObject.setValue("First one", forKey: "tital")
        }
        // success ...
    } catch let error as NSError {
        // failure
        print("Fetch failed: \(error.localizedDescription)")
    }

回答by jrturton

You're creating multiple new LoginDataobjects, but your loadLoginDatamethod is always returning the same object, the first one from the fetch request results.

您正在创建多个新LoginData对象,但您的loadLoginData方法始终返回相同的对象,即获取请求结果中的第一个对象。

You want to keep updating the same object, so you need to change your saveLoginDetailsmethod.

你想不断更新同一个对象,所以你需要改变你的saveLoginDetails方法。

Instead of creating a new object (which is what insertNewObjectForEntityName) does, use the loadLoginDetailsmethod to get your existing one, and change the property on there.

而不是创建一个新对象(这是什么insertNewObjectForEntityName),使用该loadLoginDetails方法获取现有对象,并更改那里的属性。

回答by Mauricio Valdes

 var context:NSManagedObjectContext = appDel.managedObjectContext!

 var en = NSEntityDescription.entityForName("ENTITIES_NAME", inManagedObjectContext: context)

 let batchUpdateRequest = NSBatchUpdateRequest(entity: en!)
            batchUpdateRequest.resultType = NSBatchUpdateRequestResultType.UpdatedObjectIDsResultType
            batchUpdateRequest.propertiesToUpdate = ["OBJECT_KEY": "NEWVALUE"]
            var batchUpdateRequestError: NSError?
            context.executeRequest(batchUpdateRequest, error:&batchUpdateRequestError)
            if let error = batchUpdateRequestError {println("error")}

good luck

祝你好运

回答by CSE 1994

It worked for me you should try this:

它对我有用,你应该试试这个:

let managedContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let entity = NSEntityDescription.entity(forEntityName: "Students", in: managedContext)
        let request = NSFetchRequest<NSFetchRequestResult>()
        request.entity = entity
        let predicate = NSPredicate(format: "(name = %@)", txtName.text!)
        request.predicate = predicate
        do {
            var 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()
                txtName.text = ""
                txtPhone.text = ""
                txt_Address.text = ""
                labelStatus.text = "Updated"
            }catch let error as NSError {
              labelStatus.text = error.localizedFailureReason
            }
        }
        catch let error as NSError {
            labelStatus.text = error.localizedFailureReason
        }

回答by Tej Patel

Step:1 -create new project and select "Use Core Data" go through : "https://medium.com/@ankurvekariya/core-data-crud-with-swift-4-2-for-beginners-40efe4e7d1cc"

步骤:1 -创建新项目并选择“使用核心数据”通过:“ https://medium.com/@ankurvekariya/core-data-crud-with-swift-4-2-for-beginners-40efe4e7d1cc

Step:2 -Inside ViewController (userList)

步骤:2 -内部视图控制器(用户列表)

import UIKit
import CoreData

class ViewController: UIViewController, UITableViewDelegate , UITableViewDataSource {

var arrUser = Array<Any>()
@IBOutlet var tableView: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()

    self.title = "User List"
    self.tableView.separatorStyle = .none
    self.retrieveData(Delete: false, indexpath: 0)

    let logoutBarButtonItem = UIBarButtonItem(image: UIImage(named: "addImage"), style: .done, target: self, action: #selector(addNewUser))
    self.navigationItem.rightBarButtonItem  = logoutBarButtonItem
}

override func viewDidAppear(_ animated: Bool)
{
    super.viewDidDisappear(animated)
    self.retrieveData(Delete: false, indexpath: 0)
}

@objc func addNewUser(){
    let userVC = self.storyboard?.instantiateViewController(withIdentifier: "AddUser_VC") as! AddUser_VC
    self.navigationController?.pushViewController(userVC, animated: true)
}

//MARK: - TableView DataSource Delegate
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.arrUser.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "UserCell") as! UserCell
    cell.selectionStyle = .none
    let dictData = self.arrUser[indexPath.row] as? NSManagedObject
    cell.lblName.text = dictData?.value(forKey: "name") as? String ?? ""
    cell.lblPost.text = dictData?.value(forKey: "post") as? String ?? ""
    cell.lblEmail.text = dictData?.value(forKey: "email") as? String ?? ""
    cell.lblPhone.text = String(dictData?.value(forKey: "phone") as? Int ?? 0)
    cell.imageData?.image =  UIImage(data: dictData?.value(forKey: "image") as? Data ?? Data())

    return cell
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 140
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let dictData = self.arrUser[indexPath.row] as? NSManagedObject
    let AddUserVC = self.storyboard?.instantiateViewController(withIdentifier: "AddUser_VC") as! AddUser_VC
    AddUserVC.isEdit  = true
    AddUserVC.dictObj = dictData
    self.navigationController?.pushViewController(AddUserVC, animated: true)

}

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
    return true
}

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    if (editingStyle == .delete) {
        //self.deleteData(indexpath: indexPath.row)
        self.retrieveData(Delete: true, indexpath: indexPath.row)
    }
}

//MARK: - retrieveData
func retrieveData(Delete:Bool , indexpath:Int) {

    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
    let managedContext = appDelegate.persistentContainer.viewContext
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "UserTable")

    if (Delete == true)
    {
        do
        {
            let test = try managedContext.fetch(fetchRequest)

            let objectToDelete = test[indexpath] as! NSManagedObject
            managedContext.delete(objectToDelete)

            do{
                try managedContext.save()
                self.retrieveData(Delete: false, indexpath: 0)
            }
            catch
            {
                print(error)
            }
        }
        catch
        {
            print(error)
        }
    }

    do {
        self.arrUser = try managedContext.fetch(fetchRequest)
        self.tableView.reloadData()
        print(self.arrUser)
    } catch {
         print("Failed")
    }
}
}

Step:3 -Inside UserCell

步骤:3 -内部 UserCell

import UIKit

class UserCell: UITableViewCell {


@IBOutlet var lblName: UILabel!
@IBOutlet var lblEmail: UILabel!
@IBOutlet var lblPost: UILabel!
@IBOutlet var lblPhone: UILabel!
@IBOutlet var imageData: UIImageView!

override func awakeFromNib() {
    super.awakeFromNib()
    self.imageData.layer.cornerRadius = self.imageData.frame.height / 2
    self.imageData.layer.borderWidth = 1.0
    self.imageData.layer.borderColor = UIColor.lightGray.cgColor
    self.imageData.layer.masksToBounds = true
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}

}

Step:4 -Inside AddUserVC

步骤:4 -在 AddUserVC 内部

import UIKit
import CoreData

class AddUser_VC: UIViewController ,UIImagePickerControllerDelegate ,UINavigationControllerDelegate {

var dictObj: NSManagedObject!
var isEdit:Bool = false

@IBOutlet var imageData: UIImageView!
@IBOutlet var txtName: UITextField!
@IBOutlet var txtEmail: UITextField!
@IBOutlet var txtPost: UITextField!
@IBOutlet var txtPhone: UITextField!

@IBOutlet var btnAddUser: UIButton!


override func viewDidLoad() {
    super.viewDidLoad()

    self.imageData.layer.cornerRadius = self.imageData.frame.height / 2
    self.imageData.layer.borderWidth = 1.0
    self.imageData.layer.borderColor = UIColor.lightGray.cgColor
    self.imageData.layer.masksToBounds = true

    let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))
    self.imageData.isUserInteractionEnabled = true
    self.imageData.addGestureRecognizer(tapGestureRecognizer)

    if (self.isEdit == true)
    {
        self.txtName.text = dictObj.value(forKey: "name") as? String ?? ""
        self.txtEmail.text = dictObj.value(forKey: "email") as? String ?? ""
        self.txtPost.text = dictObj.value(forKey: "post") as? String ?? ""
        self.txtPhone.text = String(dictObj.value(forKey: "phone") as? Int ?? 0)
        self.imageData?.image = UIImage(data: dictObj?.value(forKey: "image") as? Data ?? Data())
        self.btnAddUser.setTitle("UPDATE", for: .normal)
    }
}


//MARK: - btnAddUserAction Method -
@IBAction func btnAddUserAction(_ sender: Any) {

    let arrData = [self.txtName,self.txtEmail,self.txtPost,self.txtPhone]
    for txt in arrData
    {
        if (txt?.text == "")
        {
            let alert = UIAlertController(title: "Alert", message: "Please Enter All Fields", preferredStyle: UIAlertController.Style.alert)
            alert.addAction(UIAlertAction(title: "Click", style: UIAlertAction.Style.default, handler: nil))
            self.present(alert, animated: true, completion: nil)
            return
        }
    }

    self.createData()
}

//MARK: - Image Tap Method -
@objc func imageTapped(tapGestureRecognizer: UITapGestureRecognizer)
{
    let alert = UIAlertController(title: "Choose Image", message: nil, preferredStyle: .actionSheet)
    alert.addAction(UIAlertAction(title: "Camera", style: .default, handler: { _ in
        self.openCamera()
    }))

    alert.addAction(UIAlertAction(title: "Gallery", style: .default, handler: { _ in
        self.openGallery()
    }))

    alert.addAction(UIAlertAction.init(title: "Cancel", style: .cancel, handler: nil))

    self.present(alert, animated: true, completion: nil)
}

func openCamera()
{
    if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.camera) {
        let imagePicker = UIImagePickerController()
        imagePicker.delegate = self
        imagePicker.sourceType = UIImagePickerController.SourceType.camera
        imagePicker.allowsEditing = false
        self.present(imagePicker, animated: true, completion: nil)
    }
    else
    {
        let alert  = UIAlertController(title: "Warning", message: "You don't have camera", preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
        self.present(alert, animated: true, completion: nil)
    }
}

func openGallery()
{
    if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.photoLibrary){
        let imagePicker = UIImagePickerController()
        imagePicker.delegate = self
        imagePicker.allowsEditing = true
        imagePicker.sourceType = UIImagePickerController.SourceType.photoLibrary
        self.present(imagePicker, animated: true, completion: nil)
    }
    else
    {
        let alert  = UIAlertController(title: "Warning", message: "You don't have permission to access gallery.", preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
        self.present(alert, animated: true, completion: nil)
    }
}


func imagePickerController(_ picker: UIImagePickerController,
                           didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    guard (info[.originalImage] as? UIImage) != nil else {
        fatalError("Expected a dictionary containing an image, but was provided the following: \(info)")
    }
     self.imageData.image = info[.originalImage] as? UIImage
    picker.dismiss(animated: true, completion: nil)
}

//MARK: - createData
func createData(){

    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
    let managedContext = appDelegate.persistentContainer.viewContext
    let userEntity = NSEntityDescription.entity(forEntityName: "UserTable", in: managedContext)!

    var user = NSManagedObject()
    if(isEdit == true)
    {
         user = self.dictObj
    }
    else
    {
        user = NSManagedObject(entity: userEntity, insertInto: managedContext)
    }

    let image = self.imageData.image!.jpegData(compressionQuality: 0.5)as NSData?
    user.setValue(self.txtName.text, forKeyPath: "name")
    user.setValue(self.txtEmail.text, forKey: "email")
    user.setValue(self.txtPost.text, forKey: "post")
    user.setValue(Int(self.txtPhone.text!), forKey: "phone")
    user.setValue(image, forKey: "image")

    do {
        try managedContext.save()
        self.navigationController?.popViewController(animated: true)

    } catch let error as NSError {
        print("Could not save. \(error), \(error.userInfo)")
    }
}

} 

Alternate Methods:

替代方法:

//MARK: - CoreData Methods -
func createData(){
    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
    let managedContext = appDelegate.persistentContainer.viewContext
    let userEntity = NSEntityDescription.entity(forEntityName: "Movie", in: managedContext)!
    for obj in self.MoviewList.arrMovieData{
        let user = NSManagedObject(entity: userEntity, insertInto: managedContext)
        user.setValue(obj.id, forKey: "id")
        user.setValue(obj.title, forKey: "title")
        user.setValue(obj.overview, forKey: "overview")
        let url = API.IMAGE_BASE_URL + obj.poster_path
        user.setValue(url, forKey: "poster_path")
   }
    do {
        try managedContext.save()
    } catch let error as NSError {
        print("Could not save. \(error), \(error.userInfo)")
    }
}


func retrieveData() {

    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
    let managedContext = appDelegate.persistentContainer.viewContext
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Movie")
    do {
        let result = try managedContext.fetch(fetchRequest)
        var arr = [[String:AnyObject]]()
        for data in result as! [NSManagedObject] {
            var obj = [String:AnyObject]()
            obj["id"] = data.value(forKey: "id") as AnyObject
            obj["title"] = data.value(forKey: "title") as AnyObject
            obj["overview"] = data.value(forKey: "overview") as AnyObject
            obj["poster_path"] = data.value(forKey: "poster_path") as AnyObject
            arr.append(obj)
        }
        self.MoviewList = MovieDataList(data: arr)
        self.tableView.reloadData()
    } catch {

        print("Failed")
    }
}

func deleteAllRecords() {
    let delegate = UIApplication.shared.delegate as! AppDelegate
    let context = delegate.persistentContainer.viewContext

    let deleteFetch = NSFetchRequest<NSFetchRequestResult>(entityName: "Movie")
    let deleteRequest = NSBatchDeleteRequest(fetchRequest: deleteFetch)

    do {
        try context.execute(deleteRequest)
        try context.save()
        self.createData()
    } catch {

    }
}

enter image description here

在此处输入图片说明

回答by Sumona Salma

This worked for me. First i set filter by given attribute "taskName" with fetchRequest.predicate. Then i fetch data that already been saved and set value for "status" to update that object.

这对我有用。首先,我使用 fetchRequest.predicate 通过给定属性“taskName”设置过滤器。然后我获取已经保存的数据并设置“状态”的值以更新该对象。

func updateTaskStatus(status: Bool){

    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
    let managedContext = appDelegate.persistentContainer.viewContext
    let fetchRequest: NSFetchRequest<Task> = Task.fetchRequest()
    let predicate = NSPredicate(format: "(taskName = %@)", (task?.taskName)!)
    fetchRequest.predicate = predicate
    do {
        let result = try managedContext.fetch(fetchRequest)
        task = result[0] as NSManagedObject as? Task
        task?.setValue(status, forKey: "status")
        do {
            try managedContext.save()
        }catch  let error as NSError {
            print("\(error)")
        }
    }catch let error as NSError {
        print("\(error)")
    }
}

回答by Enamul Haque

In swift 4 or swift 5, you can used like bellow

在 swift 4 或 swift 5 中,你可以像下面这样使用

func update(accessToken:String,username:String){

    //1
    guard let appDelegate =
        UIApplication.shared.delegate as? AppDelegate else {
            return
    }

    let managedContext =
        appDelegate.persistentContainer.viewContext

    //2
    let fetchRequest =
        NSFetchRequest<NSManagedObject>(entityName: "LoginData")

    // 3
    let predicate = NSPredicate(format: "%K == %@", "username", username)
    fetchRequest.predicate = predicate

    //3

    do {
        let  rs = try managedContext.fetch(fetchRequest)

        for result in rs as [NSManagedObject] {

            // update
            do {
                var managedObject = rs[0]
                managedObject.setValue(accessToken, forKey: "accessToken")

                try managedContext.save()
                print("update successfull")

            } catch let error as NSError {
                print("Could not Update. \(error), \(error.userInfo)")
            }
            //end update

        }

    } catch let error as NSError {
        print("Could not fetch. \(error), \(error.userInfo)")
    }
}

回答by Dejan Skledar

There's a new feature called Batch Updates.

有一项名为批量更新的新功能。

I think this article will help you:

我认为这篇文章会帮助你:

http://www.bignerdranch.com/blog/new-in-core-data-and-ios-8-batch-updating/

http://www.bignerdranch.com/blog/new-in-core-data-and-ios-8-batch-updating/

Basicly what you do is use the NSBatchUpdateRequestinstead of NSFetchRequest, filter the results with NSPredicate, change the value in the results, and save the data.

基本上你所做的是使用NSBatchUpdateRequest而不是NSFetchRequest,过滤结果NSPredicate,改变结果中的值,并保存数据。

Another tutorial in swift:

另一个快速教程:

http://code.tutsplus.com/tutorials/ios-8-core-data-and-batch-updates--cms-22164

http://code.tutsplus.com/tutorials/ios-8-core-data-and-batch-updates--cms-22164