Измените значение атрибута через базовую связь данных
Я пытаюсь обновить значение, хранящееся в объекте, который имеет отношение "один ко многим" с другим объектом.
Мой проект - приложение для составления бюджета. Используя NSFetchedResultsController, я могу успешно добавить транзакцию (которая заполняется в таблице) и удалить транзакции, которые FRC автоматически сохраняет.
У меня есть объект, который хранит транзакции с атрибутами "имя" и "сумма", и у меня есть отдельный объект с одним атрибутом "theDate" (NSDate), который хранит дату транзакции.
Причина этого в том, что я полагал, что это упростит организационную структуру - многие транзакции могут происходить в одну и ту же дату.
Ниже я создаю сущности и сохраняю значения после создания новой транзакции, затем устанавливаю отношение:
@IBAction func done(segue: UIStoryboardSegue) {
let addTransactionVC = segue.sourceViewController as! AddTransaction
let newTrans = addTransactionVC.newTransaction
let date = addTransactionVC.datePicker.date
// Create Entities
let entity = NSEntityDescription.entityForName("DailyTransactions", inManagedObjectContext: self.managedContext)
let relatedEntity = NSEntityDescription.entityForName("TransDates", inManagedObjectContext: self.managedContext)
// Initialize Record
let record = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: self.managedContext)
let recordDate = NSManagedObject(entity: relatedEntity!, insertIntoManagedObjectContext: self.managedContext)
// Is new transaction being created or an old one being edited?
if !addTransactionVC.isEditingTransaction {
// Populate Record
record.setValue(newTrans.name, forKey: "transName")
record.setValue(newTrans.amount, forKey: "transAmount")
recordDate.setValue(date, forKey: "theDate")
// Create Relationship of Date to Transaction
record.setValue(recordDate, forKey: "date")
} else {
// If user was editing a transaction:
let updatedObject = addTransactionVC.managedObject
let newDate = addTransactionVC.datePicker.date
// How do I change the date associated with this transaction?
updatedObject.setValue(newTrans.name, forKey: "transName")
updatedObject.setValue(newTrans.amount, forKey: "transAmount")
// This line was meant to access the attribute in the "date" relationship:
updatedObject.setValue(newDate, forKey: "date")
Все выше else
работает отлично. После else
срабатывает, если ячейка (транзакция) была выбрана для редактирования. Эта строка: updatedObject.setValue(newDate, forKey: "date")
предполагалось просто обновить атрибут "theDate" объекта TransDates ("date" - это имя отношения). Но теперь я понимаю, почему это не сработает.
Поэтому я попробовал это в утверждении else:
let fetchRequestDates = NSFetchRequest(entityName: "TransDates")
do {
let dateObjects = try self.managedContext.executeFetchRequest(fetchRequestDates) as! [TransDates]
for dateObject in dateObjects {
// These 2 lines were to test that a date was being returned:
let tempDate = dateObject.theDate as! NSDate
print("dateObject is:\n\(String(tempDate))")
if dateObject.valueForKey("theDate") as! NSDate == newDate {
updatedObject.setValue(dateObject, forKey: "date")
break
}
}
} catch let error as NSError {
print("Could not fetch \(error), \(error.userInfo)")
}
Я думал, что выше просто вернет массив всех объектов TransDates и если будет найдено совпадение (ч / б, что в массиве и новый NSDate), к нему будет добавлен updatedObject, в противном случае я бы добавил некоторый код для создания newDate как новый NSManagedObject и т. д.
Однако при выполнении if dateObject.valueForKey("theDate") as! NSDate == newDate {
это происходит: "фатальная ошибка: неожиданно найден ноль при развертывании необязательного значения".
Мои два вопроса:
С точки зрения того, что я пытаюсь выполнить - обновить / изменить дату, связанную с транзакцией (если дата уже существует и содержит другие транзакции, эта транзакция просто перемещается, чтобы присоединиться к ним), это лучший способ сделать это??
У меня все цели / функциональность отношений неправильные?
Извините за этот многословный вопрос, но я застрял здесь на несколько дней. Так что спасибо заранее!
1 ответ
Причина, по которой вы получаете эту ошибку, заключается в том, что вы пытаетесь принудительно развернуть нулевое значение. Вы должны вместо этого использовать if let
заявление:
if let date dateObject.valueForKey("theDate") as? NSDate {
if date == newDate {
...
}
}