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
}
}
我正在尝试使用 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
}
}