CoreData多对多关系最佳实践

时间:2014-08-01 20:48:10

标签: ios core-data swift many-to-many entity-relationship

给出结构:

  • FIELD1
  • ...
  • 字段N
  • >> itemsTaken(inverse:takenFrom)

物品

  • FIELD1
  • ...
  • 字段N
  • >> takenFrom(inverse:itemsTaken)

Person.itemsTaken<< ------>> Items.takenFrom

场景是我有一个人员列表和一个项目列表

现在我要在人员详细信息视图中显示他拍摄的项目(这只是解决了),并在项目详细信息上显示查看完整的人员列表并选择获取该项目的人员子集。

问题是第二个视图,我将从orderedset“takenFrom”中添加/删除一个人。

override func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {
    let mo = self.fetchedResultsController.objectAtIndexPath(indexPath) as NSManagedObject

    if var x: NSMutableOrderedSet = mo.valueForKey("itemsTaken") as? NSMutableOrderedSet {
        x.addObject(detailItem)
        mo.setValue(x, forKey: "itemsTaken")
    }
    if var x: NSMutableOrderedSet = detailItem.valueForKey("takenFrom") as? NSMutableOrderedSet {
        x.addObject(mo)
        detailItem.setValue(x, forKey: "takenFrom")
    }
    (UIApplication.sharedApplication().delegate as AppDelegate).saveContext()
}

override func tableView(tableView: UITableView!, didDeselectRowAtIndexPath indexPath: NSIndexPath!) {
    let mo = self.fetchedResultsController.objectAtIndexPath(indexPath) as NSManagedObject


    if var x: NSMutableOrderedSet = mo.valueForKey("itemsTaken") as? NSMutableOrderedSet {
        x.removeObject(detailItem)
        mo.setValue(x, forKey: "itemsTaken")
    }
    if var x: NSMutableOrderedSet = detailItem.valueForKey("takenFrom") as? NSMutableOrderedSet {
        x.removeObject(mo)
        detailItem.setValue(x, forKey: "takenFrom")
    }

    (UIApplication.sharedApplication().delegate as AppDelegate).saveContext()


}

有效,但是当我重新启动应用程序时,关系的所有引用都将丢失 但我不确定我是以正确的方式进行的。

在此方法之前,我还有2个实体,以便为每个实体提供一个2个多的关系。我正在寻找更清洁的解决方案

你有任何建议或疑问吗?

只是一个澄清。目标是添加/删除person.itemsTaken和/或Item.takenFRom中的引用 我会避免删除Person。我可以只删除关系中的引用吗?

1 个答案:

答案 0 :(得分:1)

"清洁解决方案":第一步是让您的代码更具可读性。如果将对象更好地描述为mox,为什么要调用变量personitemsTaken?使代码更具可读性的另一种策略是使用NSManagedObject子类。

其次,您似乎要添加两次关系(每侧一次)。我不认为这是必要的。

第三,您可能想要检查您的可变有序集是否以您期望的方式提取。我认为使用可变访问器可能是明智的:

var itemsTaken = person.mutableSetValueForKey("itemsTaken")

不确定是否仍需要强制转换或执行其他操作以保持有序集中的顺序。根据我的经验,即使在Objective-C中,有序集也从未真正可靠地工作,因此您可能只想为排序保留一个额外的属性并更改模型以使用简单的多对多关系。