0

我正在努力更新存储在与另一个实体具有“一对多”关系的实体中存储的值。通过核心数据关系更改属性的值

我的项目是一个预算应用程序。使用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")只是为了更新TransDates实体的“theDate”属性(“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对象的数组,如果找到匹配(B/W有什么阵列和在新的NSDate)的updatedObject将执行if dateObject.valueForKey("theDate") as! NSDate == newDate {时被添加到它,否则我会添加一些代码来创建newDate作为一个新的NSManagedObject等

但是出现这种情况:“致命错误:意外发现零而展开的可选值”。

我的两个问题:

  1. 在什么,我试图完成更新条款/更改与交易相关联(如果日期已经存在,并且包含其他交易日,本次交易只移动加入他们),这是做到这一点的最好方法吗?

  2. 我有关系的目的/功能都错了吗?

对不起,这个冗长的问题,但我一直在这里呆了几天。所以先谢谢了!

回答

0

你得到这个错误的原因是因为你试图强制打开一个零值。你应该使用一个if let声明:

if let date dateObject.valueForKey("theDate") as? NSDate { 
    if date == newDate { 
     ... 
    } 
} 
+0

这将是更好的做法,但在我的情况下,阵列中的每个对象/每个TransDates对象应该有一个“theDate”与存储在它的NSDate的关键。 –

+0

显然不会,如果你得到这个错误。值为零。强制解开零值会导致每次崩溃 –