SwiftUI Preview Основные данные с отношениями - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь работать с предварительными просмотрами 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)
    }
}

Я получаю "неоднозначную ссылку" член 'init (entity: insertInto :)' "в строке newGame.Goal = Goal.init ...

Я пытаюсь выяснить, как инициализировать новую игру, а затем инициализировать подключенный Цель сразу после этого.

Мой базовый класс данных игры принимает gameName, gameDescription и цель в качестве NSSet ?. Класс Core Data Goal имеет значения goalName, goalComplete и goalOfGame: Game ?. Я думаю, что моя проблема в соединении двух.

Заранее признателен за помощь и готов поделиться большим кодом, если потребуется.

Ответы [ 2 ]

2 голосов
/ 16 января 2020

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)

, если вы устанавливаете обратные ссылки в модели данных, нет необходимости использовать методы add, сгенерированные CoreData, если у вас есть хотя бы 1 one-to-one ссылка. Вы просто устанавливаете эту ссылку как значение свойства, и 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 
    }
}
2 голосов
/ 15 января 2020

Если они имеют отношение один-ко-многим или многие-ко-многим, вы не можете просто назначить Цель игре. Когда вы используете базовые данные с отношениями, вы получаете бесплатные методы «add» с названием ваших отношений. Вы должны создать цель в одной строке

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

, а затем добавить newGoal, вызвав:

newGame.addToGoal(newGoal)

Это также должно учитывать любые обратные отношения.

...