2015-03-16 3 views
0

Я хотел бы обновить объект CoreData. Backgrund: Я сделал приложение, которое включает UITableView. В textLabel UITableViewCell это имя. В detailTextLabel этой ячейки есть дата, которую можно изменить/обновить. Теперь я хочу изменить эту дату.Обновить объект CoreData

Я написал следующий код:

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

Вы добавляете дополнительный объект в свой массив каждый раз. Ваш обновленный Person уже находится в массиве и отобразит новую информацию при перезагрузке данных таблицы. Чтобы исправить это, просто взять эту строку:

people.append(person) 
+0

Спасибо за ваш ответ! Теперь дублированная ячейка больше не появляется. Но если я добавил 3 ячейки и изменил дату 3-й, дата 1-й ячейки также обновится с новой датой, которая должна быть установлена ​​только в 3-й ячейке. Если я перезапустил приложение, все будет правильно (обновляется только 3-я ячейка). Ты знаешь почему? – user3592462

+0

Где дата? Мне нужно больше узнать о вашем коде. – kellanburket

+0

Хорошо, все решено. Я установил неправильное логическое значение. – user3592462

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? 
} 
Смежные вопросы