IOS/Core-Data:添加多对多关系

Posted

技术标签:

【中文标题】IOS/Core-Data:添加多对多关系【英文标题】:IOS/Core-Data: add many to many relationship 【发布时间】:2016-12-03 18:44:27 【问题描述】:

在项目的详细信息页面中,我的应用程序允许用户从先前创建的标签列表中标记项目。项目和标签都是 Core Data 中的一个实体,并通过多对多关系连接。

当用户在商品详情页面中选择标签时,我尝试在 Core Data 中创建如下关系:

_selectedTag.item=self.item; // where self.item is the item being viewed.

虽然只有一个项目被查看,self.item,但这种关系是多对多的,这意味着一个项目可以有多个标签,并且标签可以分配给多个项目。

因此,上述行会引发警告:从项目分配给 NSSet 的指针类型不兼容,并且当您运行应用程序时它会崩溃。

谁能建议设置这种关系的正确方法。

谢谢。

【问题讨论】:

【参考方案1】:

当您建立多对多关系时,CoreData 会生成您需要的方法来添加它生成的文件中涉及的两个实体之间的链接。例如,对于我使用的实体 Track,我与 Track 记录中名为 includesContact 的实体 Contact 具有多对多关系。基于此,CoreData 在文件 Track+CoreDataProperties.swift 中生成如下方法钩子:

// MARK: Generated accessors for includesContact
extension Track 

    @objc(addIncludesContactObject:)
    @NSManaged public func addToIncludesContact(_ value: Contact)

    @objc(removeIncludesContactObject:)
    @NSManaged public func removeFromIncludesContact(_ value: Contact)

    @objc(addIncludesContact:)
    @NSManaged public func addToIncludesContact(_ values: NSSet)

    @objc(removeIncludesContact:)
   @NSManaged public func removeFromIncludesContact(_ values: NSSet)


它在文件中为联系人实体生成反向方法挂钩。

当我需要将单个联系人添加到 includesContact 关系时,我会使用带有单个 Contact 参数的 addIncludesContact。或者,我使用 NSSet 版本为多个联系人添加关系。

例如,要将单个联系人 myContact 添加到名为 newRecord 的新 Track,其工作原理如下:

    newRecord.addToIncludesContact(myContact)

对于存储在数组 selectedContacts 中的多个联系人,如下:

    newRecord.addToIncludesContact(selectedContacts as NSSet)

希望对您有所帮助...

【讨论】:

不幸的是,我不知道 Swift。你知道在 Objective-C 中是否有任何等价物? 好的。找到了objective-c等价的访问器,但是让它工作的是将selectedTag(它是一个数组中的一个对象)放入一个NSSet中,如下所示。 _selectedTagInSet = [NSSet setWithObjects:_selectedTag, nil];一旦我这样做了,核心数据允许我设置与self.item.tag = _selectedTagInSet的关系; . 很高兴它成功了 - 对不起,从来没有拿起 ObjC

以上是关于IOS/Core-Data:添加多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

在放大graphql中添加多对多连接

添加多对多关系时检测重复插入

如何首先使用代码向 Identity 默认表 AspNetUsers 添加多对多关系?

EF Core 5.0 添加多对多使得一对多无法确定

首先在实体框架代码中与中间对象进行多对多映射

如何添加多对多的额外数据透视列?