我正在努力更新存儲在與另一個實體具有「一對多」關係的實體中存儲的值。通過核心數據關係更改屬性的值
我的項目是一個預算應用程序。使用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等
但是出現這種情況:「致命錯誤:意外發現零而展開的可選值」。
我的兩個問題:
在什麼,我試圖完成更新條款/更改與交易相關聯(如果日期已經存在,並且包含其他交易日,本次交易只移動加入他們),這是做到這一點的最好方法嗎?
我有關係的目的/功能都錯了嗎?
對不起,這個冗長的問題,但我一直在這裏呆了幾天。所以先謝謝了!
這將是更好的做法,但在我的情況下,陣列中的每個對象/每個TransDates對象應該有一個「theDate」與存儲在它的NSDate的關鍵。 –
顯然不會,如果你得到這個錯誤。值爲零。強制解開零值會導致每次崩潰 –