我正在努力更新存储在与另一个实体具有“一对多”关系的实体中存储的值。通过核心数据关系更改属性的值
我的项目是一个预算应用程序。使用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的关键。 –
显然不会,如果你得到这个错误。值为零。强制解开零值会导致每次崩溃 –