【问题标题】:Will CoreData duplicate objects?CoreData 会复制对象吗?
【发布时间】:2016-04-26 05:28:20
【问题描述】:

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

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

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

var myWorkouts = [Workout]()

“myWorkouts”数组中的一些锻炼可能已经与常规相关联,而其他锻炼可能没有(新锻炼)。我在每次锻炼和日常活动之间建立了这样的关系:

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>?

}

【问题讨论】:

    标签: ios swift core-data nsmanagedobject


    【解决方案1】:

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

    不过,我可能会建议您做几件事来让您的生活更轻松:

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

    【讨论】:

    • 我已经完成了第 1 步,但是第 2 步和第 3 步是很棒的建议,非常感谢您!我仍然习惯于更新和添加关系,所以我很感激你的解释! :D
    • 不客气!而且,在第 3 步中,一般来说,总是更理智(我第一次把它倒过来),调用将东西存储在一侧。
    • 太棒了!因此,如果我理解正确,我只需将乱码的常规!.setvalue ...更改为routine.workout =锻炼
    • 我实际上有点不清楚您的数据模型的结构以及您试图根据您的代码定义什么(以及您的代码是一对多还是多对-很多),但是如果你想为一个锻炼分配一堆乱七八糟的例程,你可以说锻炼.routines = Set(routines) 或枚举例程并调用routine.workout =routine。
    • 所以我试图将一堆锻炼定义为一个例程,我遇到了你的例程的一个问题。workout = 锻炼解决方案....它说我不能分配类型的值“锻炼”键入 Set....解决方案是类型转换,最终产品最终成为常规。workout = Set(arrayLiteral:锻炼)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 2013-05-29
    • 2013-11-29
    • 2011-06-27
    • 2012-07-08
    • 1970-01-01
    相关资源
    最近更新 更多