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

时间:2020-01-15 19:40:43

标签: swift xcode core-data swiftui preview

我正在尝试使用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:游戏?。我认为我的问题在于两者之间的联系。

提前了解帮助,并愿意在需要时共享更多代码。

2 个答案:

答案 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 
    }
}