更新CoreData中的记录时出现问题

时间:2017-09-23 11:34:54

标签: ios swift core-data

我确实经历过处理此问题的其他帖子。但是对于我的问题,我找不到多少。希望有人可以提供帮助。我的问题是......我想要在我的tableview中显示某个已编辑的记录。为此,我想在Core-Data中更新该条目。我无法弄清楚如何做到这一点。

这就是我将编辑后的数据放入tableview并保存在Core Data中的方法。更新必须在两者之间的某个地方进行,但我无法确切地知道如何以及在哪里......?

@IBAction func saveToMainEditViewController (segue:UIStoryboardSegue) {
    let detailViewController = segue.source as! EditCategoriesTableViewController
    let index = detailViewController.index
    let modelString = detailViewController.editedModel //Edited model has the edited string

    let myCategory1 = Category(context: self.context)
    myCategory1.categoryName = modelString
    mangObjArr[index!] = myCategory1     

    //Saving to CoreData
    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
        return
    }
    let managedContext = appDelegate.persistentContainer.viewContext
    let entity = NSEntityDescription.entity(forEntityName: "Category", in: managedContext)
    let category = NSManagedObject(entity: entity!, insertInto: managedContext)

    category.setValue(myCategory1.categoryName, forKeyPath: "categoryName")
    category.setValue(myCategory1.categoryId, forKey: "categoryId")
    do {

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

}

1 个答案:

答案 0 :(得分:0)

步骤:

  1. 了解基本概念
  2. 获取记录
  3. 更新记录
  4. 保存上下文
  5. 概念:

    • 这只是一个粗略的解释,正确的解释在下面的链接中。
    • 虽然很耗时,但请参考下面的链接,它将帮助您了解CoreData。如果你不明白,你以后会遇到很多问题。

    实体:

    • 在核心数据模型中,您可以创建实体,这些是表格。

    托管对象:

    • 这是实体的类表示
    • 此类的每个实例都代表表中的一行。

    托管对象上下文:

    • 想象一下托管对象上下文就像一张纸/便笺本
    • 在特定的托管对象上下文中创建/更新/删除托管对象。
    • 您可以保存/放弃对托管对象上下文所做的更改。

    非线程安全:

    • 当您在托管对象上下文中执行任何操作时,请确保在File foo2 in some/path/foo0 File foo2 in some/path/foo1 File foo2 in some/path/foo2 内使用。这将确保在上下文的队列(线程)上执行上下文操作。

    获取并更新:

    context.performAndWait { }

    保存:

    func fetch() {
    
        let request : NSFetchRequest< Category> = Category.fetchRequest()
    
        //Predicate builds the where clause to filter records
        //This is a sample, so edit based on your requirement
        request.predicate = NSPredicate(format: "categoryID = %@", argumentArray: [10])
    
        context.performAndWait {
    
            do {
                let categories = try context.fetch(request)
    
                //Update
                for category in categories {
                    category.name = "aaa"
                }
            }
            catch {
                print("error = \(error)")
            }
        }
    }
    

    参考: