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

Dal*_*ker 3 core-data ios 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

}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Fat*_*tie 15

如今,这很容易...

对于名为“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 )
Run Code Online (Sandbox Code Playgroud)

所以这只是

p.addToReplys( r )
Run Code Online (Sandbox Code Playgroud)

完整示例

在此输入图像描述


Mun*_*ndi 7

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

timeSlot.item = self
Run Code Online (Sandbox Code Playgroud)

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

// 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

这是这样使用的:

self.addObject(slot, forKey:"timeSlotItems")
Run Code Online (Sandbox Code Playgroud)


小智 5

您已将timeSlotItems和声明saveTimeSlot:为static,因此我不确定您的意图是什么。我怀疑这不是您所需要的。

与Core Data自动在运行时为属性生成优化的访问器一样,它也为关系生成访问器。

您没有说过“一对多”关系的“一侧”的名称是什么,但是如果我假设它类似于Schedule,其中Schedule有一个TimeSlot名为的一对多关系timeSlotItems,那么Core Data将在运行时生成以下内容您的访问者:

class Schedule: NSManagedObject {
    @NSManaged public var timeSlotItems: Set<TimeSlot>
    @NSManaged public func addTimeSlotItemsObject(value: TimeSlot)
    @NSManaged public func removeTimeSlotItemsObject(value: TimeSlot)
    @NSManaged public func addTimeSlotItems(values: Set<TimeSlot>)
    @NSManaged public func removeTimeSlotItems(values: Set<TimeSlot>)
}
Run Code Online (Sandbox Code Playgroud)