swift 自身实体的一对多核心数据关系

swift core data relationship one to many for own entity

你好我正在建立一个报纸数据库,它与自身有项目关系(项目可以有许多其他项目作为子项目)

这是我的 NSmanageObjectSubclass

import Foundation
import CoreData
extension Item {

    @NSManaged var by: String?
    @NSManaged var dead: NSNumber?
    @NSManaged var descendants: NSNumber?
    @NSManaged var id: NSNumber?
    @NSManaged var isdeleted: NSNumber?
    @NSManaged var score: NSNumber?
    @NSManaged var text: String?
    @NSManaged var time: NSDate?
    @NSManaged var title: String?
    @NSManaged var type: String?
    @NSManaged var url: String?
    @NSManaged var kids: NSSet?
    @NSManaged var parent: Item?
    @NSManaged var parts: NSSet?

}

问题是如何将 item 添加到 属性 kids: NSSet 关系定义是一对多的,反向的。非常感谢任何帮助。谢谢。

我的核心数据 xcmod​​el

试试这个自动创建关系和属性。

Generating Swift models from Core Data entities

即 编辑:我找到了从核心数据实体生成 Swift 模型的解决方案:

Xcode 上:

Editor > Create NSManagedOjbect > Click button "Next" > Click button "Next" > Select "Swift" Langage > Click button "Create"

这里是关于如何从头开始建立关系的 link。这是一个解释得很好且很棒的教程。通过这个,你将能够理解所有的事情。 http://code.tutsplus.com/tutorials/core-data-from-scratch-relationships-and-more-fetching--cms-21505

首先 更新您的 class 托管对象 class 以使用 Sets 而不是 NSSet

     import Foundation
        import CoreData
        extension Item {

            @NSManaged var by: String?
            @NSManaged var dead: NSNumber?
            @NSManaged var descendants: NSNumber?
            @NSManaged var id: NSNumber?
            @NSManaged var isdeleted: NSNumber?
            @NSManaged var score: NSNumber?
            @NSManaged var text: String?
            @NSManaged var time: NSDate?
            @NSManaged var title: String?
            @NSManaged var type: String?
            @NSManaged var url: String?
            @NSManaged var kids: Set<Item>
            @NSManaged var parent: Item?
            @NSManaged var parts: NSSet?

        }

其次 创建一个名为 getItemByID 的 fetchRequest 表达式 id == $ID

第三步创建一个通过id获取item的函数

    func getItemById(ID:String) -> Item?
    {
        let fetchRequest : NSFetchRequest = self.managedObjectModel.fetchRequestFromTemplateWithName("getItemByID", substitutionVariables: ["ID": ID])!
        do {
            let fetchedResult = try managedObjectContext!.executeFetchRequest(fetchRequest) as! [Item]
            if fetchedResult.count > 0 {
                let result = fetchedResult[0]
                return result
            }
        }
        catch {
            print("Could not fetch \(error)")
        }
        return nil
    }

之后你有很多设置关系的选项

a) 将父子添加到 coreData 后创建关系

func addChildToParent(childID:String,parentID:String)
    {
        if let childItem = getItemById(childID)
        {
           if let parentItem = getItemById(parentID)
           {
              parentItem.kids.insert(menuItemCatering)
              childItem.parent = parentItem
           }
        }
       saveContext()
    }