CoreData 会复制对象吗?

Will CoreData duplicate objects?

我有一个名为 "Routine," 的 NSManagedObject,它已经保存到我的数据模型中。它与另一个名为 "Workout" 的 NSManagedObject 具有一对多关系。我想编辑例程,以便为其添加更多锻炼关系。

let routine = fetchedResultsController.objectAtIndexPath(indexPath) as! Routine

我在数据模型中编辑 Routine 的 ViewController 包含一组锻炼对象:

var myWorkouts = [Workout]()

"myWorkouts" 数组中的一些锻炼可能已经与 Routine 相关联,而其他锻炼可能没有(新锻炼)。我在每次锻炼和例程之间建立了这样的关系:

for workout in myWorkouts {
    routine!.setValue(NSSet(objects: workout), forKey: "workout")
}

我的问题:如果已经创建了例程和锻炼之间的关系,上面的 for 循环是否会创建该锻炼的副本以与我的例程相关联,还是只会为以前不相关的锻炼创建新的关系?

我希望我的问题是有道理的。在此先感谢您的帮助!

例程 CoreDataProperties 文件

import Foundation
import CoreData

extension Routine {

    @NSManaged var name: String?
    @NSManaged var workout: Set<Workout>?

}

因此,您正在使用 Sets,这意味着它们始终只包含每个值一次。因此,无论封闭对象(在本例中为 NSManagedObjects)如何,其中都只有一个。你很好 - 重新声明关系不会改变任何事情。

不过,我可能会建议您可以做一些事情让您的生活更轻松:

  1. 如果您还没有创建具体的子类,请使用 Xcode 的内置工具,这样您就可以直接访问关系和属性。
  2. 在具体子类 +NSManagedObjectProperties 文件中,将那些对多关系从 NSSets? 重新定义为 Set<MyClass>?。这允许您调用 Swift-native 函数,并且可以正常工作,因为 Set 是从 NSSet.
  3. 桥接的
  4. 以后只要调用routine.workout = workout,比你代码定义关系的方式清晰多了。