Измените значение атрибута через базовую связь данных

Я пытаюсь обновить значение, хранящееся в объекте, который имеет отношение "один ко многим" с другим объектом.

Мой проект - приложение для составления бюджета. Используя 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. С точки зрения того, что я пытаюсь выполнить - обновить / изменить дату, связанную с транзакцией (если дата уже существует и содержит другие транзакции, эта транзакция просто перемещается, чтобы присоединиться к ним), это лучший способ сделать это??

  2. У меня все цели / функциональность отношений неправильные?

Извините за этот многословный вопрос, но я застрял здесь на несколько дней. Так что спасибо заранее!

1 ответ

Решение

Причина, по которой вы получаете эту ошибку, заключается в том, что вы пытаетесь принудительно развернуть нулевое значение. Вы должны вместо этого использовать if let заявление:

if let date dateObject.valueForKey("theDate") as? NSDate {
    if date == newDate {
        ...
    }
}
Другие вопросы по тегам