对象作为故障 - CoreData 关系
Posted
技术标签:
【中文标题】对象作为故障 - CoreData 关系【英文标题】:Object as faults - CoreData Relationship 【发布时间】:2016-01-22 17:21:09 【问题描述】:我有 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。
我做错了什么或没有做什么?
【问题讨论】:
【参考方案1】:该错误表明虽然 Dates
对象存在,但其 date
类型为 NSDate
的属性不存在。
通过设置date
属性并保存上下文,确保您正确创建了Dates
对象。
【讨论】:
【参考方案2】:您可以使用类型化的 Set 来代替,这样您就可以节省一些代码行:
@NSManaged var dates: Set<Dates>?
但错误表明Dates
类型的对象包含nil
属性date
。这是因为date
被定义为可选并且尚未初始化。
您可以在数据模型中将属性date
定义为非可选属性并设置默认值。然后在你的子类中定义:
@NSManaged var date: NSDate
【讨论】:
以上是关于对象作为故障 - CoreData 关系的主要内容,如果未能解决你的问题,请参考以下文章
Core Data 一对多关系:在 UITableView 中将所有相关对象列为节标题