SwiftUI 预览具有关系的核心数据

SwiftUI Preview Core Data with Relationships

我正在尝试使用 Core Data 和 SwiftUI 的预览版,我认为我已经很接近了,但还没能让它发挥作用。

    static var previews: some View {
        let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
        let newGame = Game.init(context: context)
        newGame.gameName = "Testy Game"
        newGame.gameDescription = "Wooo play the thing"
        newGame.goal = Goal.init(goalName: "Try Harder", goalComplete: false, goalOfGame: newGame)
        return GameGoalsDetail(game: newGame).environment(\.managedObjectContext, context)
    }
}

我在 newGame.Goal = Goal.init... 行收到 "Ambiguous reference to member 'init(entity:insertInto:)'"。

我正在尝试弄清楚如何初始化一个新游戏,然后立即将一个连接的目标初始化到它。

My Core Data Game class 将 gameName、gameDescription 和目标作为 NSSet?。 核心数据目标 class 有 goalName、goalComplete 和 goalOfGame: Game?。我认为我的问题是将两者联系起来。

提前感谢您的帮助,如果需要,愿意分享更多代码。

如果它们是一对多或多对多关系,则不能简单地将目标分配给游戏。当您将核心数据与关系一起使用时,您将获得带有关系名称的免费 "add" 方法。您应该在一行中创建目标

let newGoal = Goal.init(goalName: "Try Harder", goalComplete: false)

然后通过调用添加新目标:

newGame.addToGoal(newGoal)

这也应该处理任何反向关系。

Goal@NSManagedObject 这就是为什么您需要将其 init 与上下文一起使用。当你创建一个实体对象时,你必须把它放在某个商店里——上下文就是那个商店。之后,您可以转换所有需要的属性,包括 links.

let goal = Goal(context: context)
goal.goalName = "Try Harder"
goal.goalComplete = false
goal.goalOfGame = newGame
return GameGoalsDetail(game: newGame).environment(\.managedObjectContext, context)

如果您在数据模型中设置反向 links,则无需使用 CoreData 生成的添加方法,前提是您至少有 1 one-to-one link。您只需将此 link 设置为 属性 值,CoreData 会为您完成所有工作。 goal.goalOfGame 是 属性 - 尊敬 link one-to-one 到它的父级。

如果你真的想将 init 与你想要投射的所有 属性 一起使用,只需覆盖它以扩展到你的 class,如下所示:

extention Goal{
    init(of game: Game, name: String = "unnamed", complete: Bool = false, context: NSManagedObjectContext  
    ){
        super.init(context: context)
        self.goalOfGame = game
        self.goalName  = name
        self.complete = goalComplete 
    }
}