【问题标题】:Adding An Item To An NSSet For A Core Data One To Many Relationship为核心数据一对多关系向 NSSet 添加项目
【发布时间】:2015-12-16 12:19:00
【问题描述】:

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

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

我在概念上完全错了吗?谢谢!

【问题讨论】:

  • 一对多还是多对多?
  • 静态函数和self?

标签: ios core-data swift2


【解决方案1】:

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

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

【讨论】:

  • 现在实际上更容易了
【解决方案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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 我将它们都设为静态是因为这个类本质上是整个应用程序中使用的全局值类 - 该类中的所有内容都是静态的 - 我应该澄清一下,抱歉!
    • @DaleBaker 全局变量、全局托管对象、全局托管对象上下文...虽然您可能认为您需要它们,但它们绝不是一个好的解决方案,它们会导致比它们更多的问题为你“解决”。在某些时候,您会希望使用临时上下文,或者在主线程之外做一些事情,或者模拟,并且发现很难或不可能测试或封装您的代码,因为一切都是不必要的紧密耦合。
    • @TrevorSquires 其实我觉得你可以直接使用Setinsertremove方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    相关资源
    最近更新 更多