为自己的实体提供一对多的快速核心数据关系

Posted

技术标签:

【中文标题】为自己的实体提供一对多的快速核心数据关系【英文标题】:swift core data relationship one to many for own entity 【发布时间】:2016-08-11 19:28:37 【问题描述】:

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

这是我的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

【问题讨论】:

您是否在 XCDataModel 中添加了关系? 是的,我为项目设置了一对多的反向关系 【参考方案1】:

首先更新您的类 Managed Object 类以使用 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 获取项目

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

【讨论】:

您好,感谢您的帮助。我现在可以添加关系了。棘手的部分是使用 Set 而不是默认的 NSSet。这是一个错误吗?在 ObjectiveC 中,我可以使用 Xcode 生成 NSManageSubclass 工作查找,但在 Swift 中,与自己实体的关系似乎无法自动工作 这不是一个错误,但它比使用 NSSet 并获取它的可变副本然后再次保存它更容易。【参考方案2】:

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

Generating Swift models from Core Data entities

即 编辑:我找到了从 Core Data 实体生成 Swift 模型的解决方案:

Xcode:

编辑器 > 创建 NSManagedOjbect > 单击按钮“下一步” > 单击按钮 “下一步” > 选择“Swift”语言 > 点击按钮“创建”

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

【讨论】:

嗨,我已经使用它创建了。但是如何将项目添加到集合中,例如 item.kids.add(kid) 或类似的东西 您好,感谢您的帮助。我知道如何建立关系。但我的问题是将项目添加到与自己实体的关系中。我已经上传了我的 coredata 的图片并生成了 NSmanage 对象来提问。但不能将项目添加到孩子(NSSet 属性)

以上是关于为自己的实体提供一对多的快速核心数据关系的主要内容,如果未能解决你的问题,请参考以下文章

快速获取具有一对多关系的核心数据

了解一对多的核心数据删除规则

不搜索一对多核心数据关系

核心数据 - 具有一对多关系的实体正在检索除“关系”实体之外的所有实体对象的属性

iOS核心数据如何使用NSPredicate根据一对多的子属性查找父对象?

核心数据以一对多关系排序