IOS/Core-Data:添加多对多关系
问题描述:
在项目的详细信息页面中,我的应用程序允许用户从以前创建的标签列表中标记项目。项目和标签都是核心数据中的实体,并通过多对多关系进行连接。IOS/Core-Data:添加多对多关系
当用户选择在项目详细信息页面的标签,我想创建核心数据的关系如下:
_selectedTag.item=self.item; // where self.item is the item being viewed.
虽然只有一个正在观看项,self.item中,关系是多对多的意思,一个项目可以有多个标签,标签可以分配给多个项目。
因此,上面的代码行会引发警告:从项目中分配给NSSet的指针类型不兼容,当您运行该应用程序时它会崩溃。
任何人都可以建议设置这种关系的正确方法。
谢谢。
答
当您设置多对多关系时,CoreData会生成您需要的方法来添加它生成的文件中涉及的两个实体之间的链接。例如,对于我使用的实体跟踪,我与跟踪记录中名为includesContact的实体联系人具有多对多关系。基于此,产生CoreData在文件音轨+ 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)
}
它用于联系人实体的文件中生成反向方法钩。
当我需要将一个Contact添加到includesContact关系时,我使用addIncludesContact和一个Contact参数。或者,我使用NSSet版本为多个联系人添加关系。
例如,要添加一个联系人,myContact,一个叫做newRecord新的轨道,这种工作方式如下:
newRecord.addToIncludesContact(myContact)
对于存储在阵列selectedContacts多个联系人,这是不言而喻如下:
newRecord.addToIncludesContact(selectedContacts as NSSet)
希望帮助...
不幸的是,我不知道斯威夫特。你知道Objective-C中是否有任何等价物? – user6631314
好的。找到了与objective-c等效的访问器,但是它的工作原理是将selectedTag作为数组中的一个对象放入NSSet中,如下所示。 _selectedTagInSet = [NSSet setWithObjects:_selectedTag,nil];一旦我这样做了,核心数据就允许我设置与self.item.tag = _selectedTagInSet; 。 – user6631314
很高兴,它的工作 - 抱歉,从来没有拿起ObjC –