如何在Swift中分配核心数据多对多关系?

时间:2014-07-15 10:48:42

标签: ios cocoa-touch core-data swift

我有一个NSManagedObject类

class Disease: NSManagedObject {
    @NSManaged var diseaseId: String
    @NSManaged var diseaseName: String
    @NSManaged var dogBreed: NSSet
}

如何为dogBreed添加新关系?如果我将var类型更改为NSMutableSet,则更改不会保存到数据库。有什么想法吗?

6 个答案:

答案 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

答案受到启发:Setting an NSManagedObject relationship in Swift

答案 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")
}