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

顯然不會,如果你得到這個錯誤。值爲零。強制解開零值會導致每次崩潰 –