为核心数据一对多关系向NSSet添加项目

问题描述 投票:3回答:3

我有一个核心数据关系,其中一个实体拥有另一个实体。据我所知,许多类的每个实例都保存在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值。时隙是我要添加的许多对象。

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

我在概念上根本不对吗?谢谢!

ios core-data swift2
3个回答
7
投票

对于一对多来说,这很容易。只需使用反向一对一关系即可。

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")

5
投票

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

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

[您没有说多对多关系的“一侧”的名称是什么,但是如果我假设它类似于Schedule,其中ScheduleTimeSlot有多对多关系称为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>)
}

1
投票

现在很容易...

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

© www.soinside.com 2019 - 2024. All rights reserved.