我有一个NSManagedObject类
class Disease: NSManagedObject {
@NSManaged var diseaseId: String
@NSManaged var diseaseName: String
@NSManaged var dogBreed: NSSet
}
如何为dogBreed添加新关系?如果我将var类型更改为NSMutableSet,则更改不会保存到数据库。有什么想法吗?
答案 0 :(得分:21)
从Xcode 7和Swift 2.0开始,release note 17583057声明:
NSManaged属性可以与方法一起使用 属性,用于访问自动生成的Core Data 符合键值编码的兼容多种访问器。
@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)
答案 1 :(得分:18)
由于严格的类型系统,Swift无法生成动态运行时访问器。您可以创建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)
}
}
<强>说明:强>
我建议您为扩展程序Disease+CoreData.swift
创建单独的文件,这有助于在重新生成CoreData
模型时防止代码覆盖。
在其中一个托管对象中创建关系就足够了,第二个将使用后向引用进行更新。 (与Objective-C相同)
重要事项:要使一切顺利,您应该验证CoreData模型中实体的类名是否包含您的模块名称。例如。 MyProjectName.Disease
答案 2 :(得分:10)
如果您正在寻找一种简单的方法,请使用它。
import CoreData
extension NSManagedObject {
func addObject(value: NSManagedObject, forKey: String) {
var items = self.mutableSetValueForKey(forKey);
items.addObject(value)
}
}
实施:
department.addObject(section, forKey: "employees")
而不是在需要它的每个NSManageObject类上编写相同的方法。
答案 3 :(得分:4)
其实你可以写:
@NSManaged var dogBreed: Set<DogBreed>
直接使用insert
的{{1}}和remove
方法。
答案 4 :(得分:2)
@Nycen使用现在自动实现的方法为Xcode 7提供了最佳解决方案,但请注意NSOrderedSet
问题几乎令人难以置信(请参阅this question),因此如果使用NSOrderedSet
对于您的关系而不是NSSet
,您仍需要使用解决方法。
(我会评论而不是发布新答案,但我缺少分数)
答案 5 :(得分:1)
如果您需要使用NSOrderedSet
代替NSSet
,我一直在使用以下代码,这样可以更轻松地使用NSMutableOrderedSet
方法添加,插入和删除对象。
@NSManaged private var myOrderedSet: NSOrderedSet
var myMutableOrderedSet: NSMutableOrderedSet {
return self.mutableOrderedSetValueForKey("myOrderedSet")
}