【问题标题】:How to Update existing objects in Core Data? [duplicate]如何更新 Core Data 中的现有对象? [复制]
【发布时间】:2015-04-16 01:13:34
【问题描述】:

我想更新 Core Data 中的一个对象。这是我的代码:

var detailTaskModel: TaskModel!
detailTaskModel.date = dateFromDP         //update value

let appDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
appDelegate.saveContext()

我正在使用 NSFetchedResultsController 和 Swift。

更新:

var fetchedResultsController: NSFetchedResultsController = NSFetchedResultsController()

我用于加载 CoreData 数据的函数:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    var cell: TaskCell = tableView.dequeueReusableCellWithIdentifier("myCell") as TaskCell

    let thisTask = fetchedResultsController.objectAtIndexPath(indexPath) as TaskModel
    cell.textLabel?.text = thisTask.task
    return cell
}

保存核心数据:

let appDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
let entityDescription = NSEntityDescription.entityForName("TaskModel", inManagedObjectContext: managedObjectContext!)
let task = TaskModel(entity: entityDescription!, insertIntoManagedObjectContext: managedObjectContext!)
task.task = labelText

【问题讨论】:

  • 你的问题是什么? :D
  • 如何更新 CoreData 对象。
  • 那太好了 :) 我还是会尽量具体一点。
  • 你能帮我解决这个问题吗?

标签: ios swift core-data nsmanagedobject


【解决方案1】:

您只需更新 Core 数据对象的任何属性并在 NSManagedObjectContext 上调用 save。您还可以使用 hasChanges 方法检查任何更改。

 managedObject.setValue("newValue", forKey: "propertyName") 

像上面一样更新您的对象或直接调用分配并执行以下操作

if let moc = self.managedObjectContext {
   var error: NSError? = nil
   if moc.hasChanges {
       !moc.save(&error)
   }
}

【讨论】:

  • 确保你的对象和保存方法在同一个NSManagedObjectContext下
  • 我就是这样做的。这是正确的:let thisTask = fetchedResultsController.objectAtIndexPath(editIndexPath) as TaskModel thisTask.date = dateFromDP // dateFromDP = the new date self.fetchedResultsController.managedObjectContext.save(nil)
  • @pablo 代码应该可以工作。您可以在保存中传入 NSError 对象并检查问题所在吗?那么我可以为您提供更多帮助。
  • 好的。如果我运行此代码,应用程序会在这行代码处崩溃下一次启动:cell.textLabel?.text = thisTask.task 任务是一个标签,应该加载到 tableViewCell 中。
  • 这可能是因为 thisTask.task 为 nil,打印 thisTask.task 的值以确保它不是 nil
【解决方案2】:

在 CoreData 中更新一个对象与创建一个新对象非常相似。 首先,您必须使用 fetchRequest 从 CoreData 获取您的对象。之后,您可以编辑获取的对象并更新其属性。 之后,只需使用 managedObjectContext 将其保存回来。

【讨论】:

【解决方案3】:

你可以这样做,对我有用。

if let container = (UIApplication.shared.delegate as? AppDelegate)?.persistentContainer{

        let context = container.viewContext

        let fetchRequest = NSFetchRequest<Account>(entityName: "Account")

        let name = self.txtAccount.text

        fetchRequest.predicate = NSPredicate(format: "name == %@", name!)

        do {

            let results = try context.fetch(fetchRequest)

            if (results.count > 0){

                for result in results{

                    id = result.id
                    number = result.number

                }

                actualNumber = (number + 1)

                //Update the account balance
                let update = results[0]
                update.number = actualNumber

                try context.save()

                return id

            }

        }catch let error {

            print("Error....: \(error)")

        }

您不必将 'result[0] 写为! NSManagedObject' 因为你有 Account 类型的 NSFetchRequest 并且常量“更新”知道这一点。

【讨论】:

    猜你喜欢
    • 2012-05-21
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多