如何在Swift中分配CoreData多对多的关系?
我有一个NSManagedObject类
class Disease: NSManagedObject { @NSManaged var diseaseId: String @NSManaged var diseaseName: String @NSManaged var dogBreed: NSSet }
如何添加一个新的关系dogBreed? 如果我更改vartypes为NSMutableSet,更改不保存到数据库。 有任何想法吗?
从Xcode 7和Swift 2.0开始, 发行说明 17583057指出:
NSManaged属性可以与方法和属性一起使用,以访问Core Data自动生成的Key-Value-Coding兼容的多对多访问器。
@NSManaged var employees: NSSet @NSManaged func addEmployeesObject(employee: Employee) @NSManaged func removeEmployeesObject(employee: Employee) @NSManaged func addEmployees(employees: NSSet) @NSManaged func removeEmployees(employees: NSSet)
这些可以在NSManagedObject子类中声明。 (17583057)
所以你只需要声明下面的方法,CoreData将负责其余的部分:
@NSManaged func addDogBreedsObject(dogBreed: DogBreed) @NSManaged func removeDogBreedsObject(dogBreed: DogBreed) @NSManaged func addDogBreeds(dogBreeds: NSSet) @NSManaged func removeDogBreeds(dogBreeds: NSSet)
由于严格的types系统,Swift不能生成dynamic运行时访问器。 您可以创build一个扩展到Disease
类,并手动添加错过的方法,这里是代码:
extension Disease { func addDogBreedObject(value:DogBreed) { var items = self.mutableSetValueForKey("dogBreed"); items.addObject(value) } func removeDogBreedObject(value:DogBreed) { var items = self.mutableSetValueForKey("dogBreed"); items.removeObject(value) } }
备注:
我build议你为扩展名为Disease+CoreData.swift
创build单独的文件,当你重新生成CoreData
模型时,这应该有助于保持代码免于覆盖。
在一个被pipe理的对象中创build关系就足够了,第二个将被反向引用更新。 (与Objective-C一样)
重要提示:为了完成所有工作,您应该validationCoreData模型中的实体类名是否包含模块名称。 例如MyProjectName.Disease
答案启发: 在Swift中设置一个NSManagedObject关系
如果你正在寻找一个简单的方法就使用这个。
import CoreData extension NSManagedObject { func addObject(value: NSManagedObject, forKey: String) { var items = self.mutableSetValueForKey(forKey); items.addObject(value) } }
执行:
department.addObject(section, forKey: "employees")
而不是每个需要它的NSManageObject类编写相同的方法。
其实你可以写:
@NSManaged var dogBreed: Set<DogBreed>
并直接使用Set
的insert
和remove
方法。
作为@Naz的扩展。 结合@Ash的评论。 我发现了唯一的xCode 6.3.1工作解决scheme
import CoreData extension NSManagedObject { func addObject(value: NSManagedObject, forKey: String) { self.willChangeValueForKey(forKey, withSetMutation: NSKeyValueSetMutationKind.UnionSetMutation, usingObjects: NSSet(object: value) as Set<NSObject>) var items = self.mutableSetValueForKey(forKey); items.addObject(value) self.didChangeValueForKey(forKey, withSetMutation: NSKeyValueSetMutationKind.UnionSetMutation, usingObjects: NSSet(object: value) as Set<NSObject>) } }
您必须调用willChange和didChange处理程序才能在Swift中正确添加对象到多对多关系。
myManagedObject.addObject(value, forKey: "yourKey")
@Nycen有现在自动实现的方法的Xcode 7的最佳解决scheme,但请注意, NSOrderedSet
问题几乎难以置信地仍然存在(请参阅此问题 ),所以如果使用NSOrderedSet
而不是NSSet
您的关系,您仍然需要使用一个解决方法。
(我会评论,而不是张贴一个新的答案,但我缺乏点)
如果您需要使用NSOrderedSet
而不是NSSet
,我一直在使用下面的代码,这使得更容易获取NSMutableOrderedSet
方法来添加,插入和删除对象。
@NSManaged private var myOrderedSet: NSOrderedSet var myMutableOrderedSet: NSMutableOrderedSet { return self.mutableOrderedSetValueForKey("myOrderedSet") }