2016-12-03 92 views
0

在項目的詳細信息頁面中,我的應用程序允許用戶從以前創建的標籤列表中標記項目。項目和標籤都是核心數據中的實體,並通過多對多關係進行連接。IOS/Core-Data:添加多對多關係

當用戶選擇在項目詳細信息頁面的標籤,我想創建核心數據的關係如下:

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

雖然只有一個正在觀看項,self.item中,關係是多對多的意思,一個項目可以有多個標籤,標籤可以分配給多個項目。

因此,上面的代碼行會引發警告:從項目中分配給NSSet的指針類型不兼容,當您運行該應用程序時它會崩潰。

任何人都可以建議設置這種關係的正確方法。

謝謝。

回答

1

當您設置多對多關係時,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) 

希望幫助...

+0

不幸的是,我不知道斯威夫特。你知道Objective-C中是否有任何等價物? – user6631314

+0

好的。找到了與objective-c等效的訪問器,但是它的工作原理是將selectedTag作爲數組中的一個對象放入NSSet中,如下所示。 _selectedTagInSet = [NSSet setWithObjects:_selectedTag,nil];一旦我這樣做了,核心數據就允許我設置與self.item.tag = _selectedTagInSet; 。 – user6631314

+0

很高興,它的工作 - 抱歉,從來沒有拿起ObjC –