更新核心数据对象

时间:2015-03-16 20:44:33

标签: ios uitableview swift core-data

我想更新CoreData对象。 Backgrund:我制作了一个包含UITableView的应用程序。在UITableViewCell的textLabel中是一个名称。在此单元格的detailTextLabel中,可以更改/更新日期。现在我想改变这个日期。

我写了以下代码:

 var people = [NSManagedObject]()


 func saveDate(date: NSDate) {

      //1
      let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
      let managedContext = appDelegate.managedObjectContext!

      //2
      let entity =  NSEntityDescription.entityForName("Person", inManagedObjectContext:managedContext)
      let person = people[dateIndexPath.row]

      //3
      person.setValue(date, forKey: "datum")

      //4
      var error: NSError?
      if !managedContext.save(&error) {
          println("Could not save \(error), \(error?.userInfo)")
      }

      //5
      people.append(person)
      tableView.reloadData()
 }

现在,如果我运行此代码: 日期已成功更新,但更新日期的单元格显示2次。例如,如果我添加了3个单元格并更改了第3个单元格中的日期,我现在显示4个单元格,其中2个具有相同的内容/重复。

有人知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

您每次都要向阵列添加其他对象。您更新的Person已经在数组中,并在您重新加载表数据时显示新信息。要解决这个问题,只需要删除这一行:

people.append(person)

答案 1 :(得分:0)

您可能希望将某种唯一标识符属性与您的Person类相关联。这允许稍后使用它标识符检索该相同对象。我建议使用UUID字符串值,称为personIDidentifier,或类似名称。

您可以覆盖awakeFromInsert类上的Person方法,如下所示:

// This is called when a new Person is inserted into a context
override func awakeFromInsert()
{
    super.awakeFromInsert()

    // Automatically assign a randomly-generated UUID
    self.identifier = NSUUID().UUIDString
}

如果要编辑现有人员,则需要UUID检索它。我建议像这样的类函数(在Person类中):

class func personWithIdentifier(identifier: String, inContext context: NSManagedObjectContext) -> Person?
{
    let fetchRequest = NSFetchRequest(entityName: "Person")
    fetchRequest.predicate = NSPredicate(format: "identifier ==[c] %@", identifier)
    fetchRequest.fetchLimit = 1  // Only want the first result

    var error : NSError?
    let results = context.executeFetchRequest(fetchRequest, error: &error) as [Person]

    // Handle error here

    return results.first?
}

这样您就可以使用以下功能:

let identifier = ...
let context = ...

var person = Person.personWithIdentifier(identifier, inContext: context)

if let person = person
{
  // Edit the person
  person.value = // change the values as you need
}
else
{
   // Person does not exist!
   person = // possibly create a person?
}