我正在尝试使用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 ...行上,我得到了“对成员'init(entity:insertInto :)'的歧义引用”。
我正在尝试弄清楚如何初始化一个新游戏,然后在其后立即初始化与其关联的目标。
我的核心数据游戏类将gameName,gameDescription和一个目标作为NSSet? 核心数据目标类具有GoalName,goalComplete和goalOfGame:游戏?。我认为我的问题在于两者之间的联系。
提前了解帮助,并愿意在需要时共享更多代码。
答案 0 :(得分:2)
如果它们是一对多或多对多关系,则不能简单地将目标分配给游戏。当您将核心数据用于关系时,您将获得带有关系名称的免费“添加”方法。您应该在一行上创建目标
let newGoal = Goal.init(goalName: "Try Harder", goalComplete: false)
,然后通过调用添加新目标:
newGame.addToGoal(newGoal)
那也应该照顾到任何逆向关系。
答案 1 :(得分:2)
Goal
是@NSManagedObject
,这就是为什么需要将其init与上下文一起使用的原因。当您创建实体对象时,必须将其放置在某个商店中-上下文就是该商店。之后,您可以转换所需的所有属性,包括链接。
let goal = Goal(context: context)
goal.goalName = "Try Harder"
goal.goalComplete = false
goal.goalOfGame = newGame
return GameGoalsDetail(game: newGame).environment(\.managedObjectContext, context)
如果您在数据模型中设置了反向链接,则如果您至少有1个one-to-one
链接,则无需使用CoreData生成的添加方法。您只需将此链接设置为属性值,CoreData即可为您完成所有工作。 goal.goalOfGame
是该属性-重新链接到其父级的one-to-one
链接。
如果您确实想对要转换的所有属性都使用init,请像这样在类的范围内覆盖它:
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
}
}