对象作为错误 - CoreData关系

时间:2016-01-22 17:21:09

标签: swift core-data

我有两个实体:

  1. Todo
  2. 日期
  3. 它们以反向关系连接,因此一个Todo对象可以有多个Dates,因此Todo具有属性:

    @NSManaged var dates: NSSet?
    @NSManaged var name: String?
    

    并且每个Dates对象可以有一个Todo,因此它具有属性:

    @NSManaged var todo: Todo?
    @NSManaged var wasDone: NSNumber? //It is a boolean
    @NSManaged var date: NSDate?
    

    当我创建Todo时,我在实体名称中插入新对象。

    //Saving into local device context
            guard let ourcontext = self.context else {print("no context");return}
            guard let newTodo = NSEntityDescription.insertNewObjectForEntityForName("Todo", inManagedObjectContext: ourcontext) as? Todo else {return}
            let myTodoName = self.addTodoView.searchTextField.text
            newTodo.name = myTodoName
    

    然后我计算了日期,我想将它们插入到Todo的NSSet中(我在Todo中创建了一个函数:

    func addObject(value: Dates) {
            let dates = self.mutableSetValueForKey("dates")
            dates.addObject(value)
        }
    

    所以在计算了日期并创建了它们的“datesArray”后,我想将它们添加到上面提到的NSSet中:

    for _ in self.datesArray {
                guard let newDate = NSEntityDescription.insertNewObjectForEntityForName("MedicineDates", inManagedObjectContext: ourContext) as? MedicineDates else {return}
    
                newTodo.addObject(newDate)
    

    这是第一个问题 - 我是否正确创建了对象之间的关系?

    然后我想创建(在cellForRowAtIndexPath中,因为这在tableView中显示)来自Todo的NSSet的一个数组:

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCellWithIdentifier("MyCell", forIndexPath: indexPath) as! TodoTableViewCell
            guard let object = fetchedResultsController?.objectAtIndexPath(indexPath) as? Todo else {return cell}
    

    NSSet to Array:

    let fetchedData = object.dates?.allObjects as! [Dates]
    let datesArray = [NSDate]()
    for object in fetchedData {
        datesArray.append(object.date!)
    }
    

    这就是热潮。当我试图解开object.date时,它告诉我“在解开一个Optional值时意外地发现了nil”,但我知道带有“Date”类型对象的fetchedData存在。

    我做错了什么或者我没有做错?

2 个答案:

答案 0 :(得分:0)

该错误表示虽然存在Dates个对象,但date类型的NSDate属性却没有。

确保通过设置Dates属性并保存上下文来正确创建date对象。

答案 1 :(得分:0)

您可以使用类型化的Set,以便保存一些代码行:

@NSManaged var dates: Set<Dates>?

但错误表明Dates类型的对象包含nil属性date。这是因为date被定义为可选的并且尚未初始化。

您可以在数据模型中将属性date定义为非可选项,并设置默认值。然后在你的子类中定义:

@NSManaged var date: NSDate