【问题标题】:Object as faults - CoreData Relationship对象作为故障 - CoreData 关系
【发布时间】:2016-01-22 17:21:09
【问题描述】:

我有 2 个实体:

  1. 待办事项
  2. 日期

它们之间存在反比关系,因此一个 Todo 对象可以有多个 Date,因此 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)

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

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

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 到数组:

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

这里是繁荣。当我尝试解开 object.date 时,它​​告诉我“在解开可选值时意外发现 nil”,但我知道其中存在带有“Date”类型对象的 fetchedData。

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

【问题讨论】:

    标签: swift core-data


    【解决方案1】:

    该错误表明虽然 Dates 对象存在,但其 date 类型为 NSDate 的属性不存在。

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

    【讨论】:

      【解决方案2】:

      您可以使用类型化的 Set 来代替,这样您就可以节省一些代码行:

      @NSManaged var dates: Set<Dates>?
      

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

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

      @NSManaged var date: NSDate
      

      【讨论】:

        猜你喜欢
        • 2012-02-11
        • 2015-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-22
        • 1970-01-01
        • 2013-01-16
        • 1970-01-01
        相关资源
        最近更新 更多