将项添加到NSSet以获取核心数据的一对多关系

时间:2015-12-16 12:19:00

标签: ios core-data swift2

我有一个核心数据关系,其中一个实体拥有许多另一个实体。据我所知,许多类的每个实例都保存在NSSet中?在一个班级里面。 (?)

我的问题是 - 在此套装中添加商品的最佳方式是什么?我认为这一定是一个非常普遍的问题 - 但我似乎找不到一个简单的方法。

这是我的尝试:(这一切都来自一个班级)

static var timeSlotItems: NSSet? //The Set that holds the many?


...



static func saveTimeSlot(timeSlot: TimeSlot) { //TimeSlot is the many object
    retrieveValues()
    var timeSlotArray = Array(self.timeSlotItems!)
    timeSlotArray.append(timeSlot)
    var setTimeSlotItems = Set(timeSlotArray)
    self.timeSlotItems = setTimeSlotItems // This is the error line

}

其中retrieveValues()只更新类中的所有coreData值。 TimeSlot是我要添加的许多对象。

我在最后一行收到错误,错误是:“无法使用类型为Array的列表参数调用类型Set< _>的初始值设定项”

我在概念上是错的吗?谢谢!

3 个答案:

答案 0 :(得分:5)

对于一对多,这很容易。只需使用反向一对一的关系。

timeSlot.item = self

对于多对多,我使用这种方便的方法:

// Support adding to many-to-many relationships

extension NSManagedObject {
    func addObject(value: NSManagedObject, forKey key: String) {
        let items = self.mutableSetValueForKey(key)
        items.addObject(value)
    }

    func removeObject(value: NSManagedObject, forKey key: String) {
        let items = self.mutableSetValueForKey(key)
        items.removeObject(value)
    }
}

使用如下:

self.addObject(slot, forKey:"timeSlotItems")

答案 1 :(得分:5)

您已将timeSlotItemssaveTimeSlot:声明为静态,因此我不确定您的意图是什么。我怀疑这不是你需要的。

与Core Data自动为运行时生成属性的优化访问器的方式相同,它也为关系生成访问器。

你没有说出to-many关系的“一”方面的名称是什么,但如果我认为它类似于Schedule,那么Schedule具有多对多关系与名为TimeSlot的{​​{1}}的关系,然后Core Data将为您运行时生成以下访问者:

timeSlotItems

答案 2 :(得分:2)

如今,这很容易...

对于名为“ Reply”的多个商品,CoreData知道要添加呼叫“ addToReplys”。

因此...

p = one Post. your core data Post items have many core data Reply items.

for jr in yourJson {
    r = convert jr to a core data Reply
    
    p.addToReplys( r )

就这样

p.addToReplys( r )

Full example

enter image description here