我想更新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个具有相同的内容/重复。
有人知道如何解决这个问题吗?
答案 0 :(得分:0)
您每次都要向阵列添加其他对象。您更新的Person
已经在数组中,并在您重新加载表数据时显示新信息。要解决这个问题,只需要删除这一行:
people.append(person)
答案 1 :(得分:0)
您可能希望将某种唯一标识符属性与您的Person
类相关联。这允许稍后使用它标识符检索该相同对象。我建议使用UUID
字符串值,称为personID
,identifier,
或类似名称。
您可以覆盖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?
}