Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode 通过核心数据关系更改属性值_Xcode_Swift_Nsfetchedresultscontroller_Relationships_Managedobjectcontext - Fatal编程技术网

Xcode 通过核心数据关系更改属性值

Xcode 通过核心数据关系更改属性值,xcode,swift,nsfetchedresultscontroller,relationships,managedobjectcontext,Xcode,Swift,Nsfetchedresultscontroller,Relationships,Managedobjectcontext,我正在努力更新存储在与另一个实体具有“一对多”关系的实体中的值 我的项目是一个预算应用程序。使用NSFetchedResultsController,我可以成功地添加事务(在表中填充)并删除FRC自动保存的事务 我有一个实体存储属性为“name”和“amount”的交易,我有一个单独的实体,其中一个属性为“theDate”(NSDate),用于存储交易日期 之所以将其分开,是因为我相信这将在组织上使其更简单许多交易可以在同一日期发生 在下面的示例中,我创建了实体,并在创建新事务后存储了值,然后设

我正在努力更新存储在与另一个实体具有“一对多”关系的实体中的值

我的项目是一个预算应用程序。使用NSFetchedResultsController,我可以成功地添加事务(在表中填充)并删除FRC自动保存的事务

我有一个实体存储属性为“name”和“amount”的交易,我有一个单独的实体,其中一个属性为“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
之后触发。这一行:
updateobject.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)")
        }
if let date dateObject.valueForKey("theDate") as? NSDate {
    if date == newDate {
        ...
    }
}
我认为上面的代码只会返回一个包含所有TransDates对象的数组,如果找到匹配项(b/w数组中的内容和新的NSDate),UpdateObject就会被添加到其中,否则我会添加一些代码,将newDate创建为新的NSManagedObject,等等

但是,当执行
if dateObject.valueForKey(“theDate”)时!NSDate==newDate{
发生这种情况:“致命错误:在展开可选值时意外发现nil”

我的两个问题:

  • 就我试图完成的更新/更改与事务关联的日期而言(如果该日期已经存在并且包含其他事务,则该事务只是移动过来加入它们),这是最好的方法吗

  • 我是否对关系的目的/功能都有误解


  • 对于这个冗长的问题,很抱歉,我已经被困在这里好几天了。因此,请提前感谢!

    您出现此错误的原因是您试图强制展开一个nil值。您应该使用
    if let
    语句:

            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)")
            }
    
    if let date dateObject.valueForKey("theDate") as? NSDate {
        if date == newDate {
            ...
        }
    }
    

    这将是更好的实践,但在我的场景中,数组中的每个对象/每个TransDates对象都应该有一个“theDate”键,其中存储了一个NSDate。如果出现此错误,则显然没有。值为nil。强制展开nil值每次都会导致此崩溃