Post

Replies

Boosts

Views

Activity

Dependent models preview container error
I have a set of cascading dependent models. I want to create a preview container that adds them all to a preview container. I have created a model container which loads a recipe of my choice in sequentialy so the instantiation works. I noticed that everything loads but only 1 RecipeStep will ever be added. No matter how I do it, only one is added (randomly). What is the best practice for creating a swiftdata preview with dependent models? How can I put them in a struct / class for easy access? I tried making a class that initialized the whole swiftdata object however the preview crashes when using this. Note: I know one solution is that I could make child to parent fields optional, but I don't want to do that since I need them required. @Model class CocktailRecipe { @Attribute(.unique) var id: UUID @Attribute(.unique) var name: String var info: String? var menu: CocktailMenu? @Relationship(deleteRule: .cascade, inverse: \Ingredient.recipe) var ingredients: [Ingredient] @Relationship(deleteRule: .cascade, inverse: \RecipeSection.recipe) var sections: [RecipeSection] var created_at: Date init(name: String, info: String? = nil, menu: CocktailMenu? = nil, sections: [RecipeSection] = [], ingredients: [Ingredient] = []) { self.name = name self.info = info self.menu = menu self.sections = sections self.ingredients = ingredients self.created_at = Date() self.id = UUID() } } @Model class Ingredient { @Attribute(.unique) var id: UUID @Attribute(.unique) var name: String var quantity: Float? var units: IngredientUnitType var type: IngredientType var recipe: CocktailRecipe var created_at: Date init(name: String, quantity: Float? = nil, units: IngredientUnitType, type: IngredientType, recipe: CocktailRecipe) { self.name = name self.quantity = quantity self.units = units self.type = type self.recipe = recipe self.created_at = Date() self.id = UUID() } } @Model class RecipeSection { @Attribute(.unique) var id: UUID @Attribute(.unique) var title: String? @Attribute(.unique) var index: Int @Relationship(deleteRule: .cascade, inverse: \RecipeStep.section) var steps: [RecipeStep] var recipe: CocktailRecipe var created_at: Date init(title: String? = nil, recipe: CocktailRecipe, steps: [RecipeStep] = []) { self.title = title self.recipe = recipe self.index = recipe.sections.count + 1 self.steps = steps self.created_at = Date() self.id = UUID() } } @Model class RecipeStep { @Attribute(.unique) var id: UUID @Attribute(.unique) var instruction: String @Attribute(.unique) var index: Int var section: RecipeSection var created_at: Date init(instruction: String, section: RecipeSection) { self.instruction = instruction self.section = section self.index = section.steps.count + 1 self.created_at = Date() self.id = UUID() } } let cocktailPreviewContainer: ModelContainer = { do { let container = try ModelContainer( for: CocktailMenu.self, CocktailRecipe.self, Ingredient.self, RecipeSection.self, RecipeStep.self, /*Bottle.self, Bar.self, */ configurations: ModelConfiguration(isStoredInMemoryOnly: true) ) let modelContext = container.mainContext let spicyMargarita = CocktailRecipe(name: "Spicy Margarita") modelContext.insert(spicyMargarita) // Initialize ingredients let spicyMargaritaIngredients = [ Ingredient(name: "Tequila", quantity: 2, units: .ounces, type: .tequila, recipe: spicyMargarita), Ingredient(name: "Lime Juice", quantity: 1, units: .ounces, type: .mixer, recipe: spicyMargarita), Ingredient(name: "Agave Syrup", quantity: 0.5, units: .ounces, type: .mixer, recipe: spicyMargarita), // Ingredient(name: "Jalapeno", quantity: 3, units: .slices, type: .garnish, recipe: spicyMargarita) ] for ingredient in spicyMargaritaIngredients { modelContext.insert(ingredient) } try? modelContext.save() // Initialize sections and steps let preparationSection = RecipeSection(title: "title here", recipe: spicyMargarita) modelContext.insert(preparationSection) try? modelContext.save() let step1 = RecipeStep(instruction: "Muddle the jalapeno slices in the shaker.", section: preparationSection) modelContext.insert(step1) let step2 = RecipeStep(instruction: "Add tequila, lime juice, and agave syrup to shaker with ice.", section: preparationSection) modelContext.insert(step2) let step3 = RecipeStep(instruction: "Shake well.", section: preparationSection) modelContext.insert(step3) let step4 = RecipeStep(instruction: "Strain into a chilled glass.", section: preparationSection) modelContext.insert(step4) return container } catch { fatalError("Failed to create container") } }() var spicyMargarita: CocktailRecipe init() { // Initialize spicyMargarita recipe spicyMargarita = CocktailRecipe(name: "Spicy Margarita") // Initialize ingredients let tequila = Ingredient(name: "Tequila", quantity: 2, units: .ounces, type: .tequila, recipe: spicyMargarita) let limeJuice = Ingredient(name: "Lime Juice", quantity: 1, units: .ounces, type: .mixer, recipe: spicyMargarita) let agaveSyrup = Ingredient(name: "Agave Syrup", quantity: 0.5, units: .ounces, type: .mixer, recipe: spicyMargarita) let jalapeno = Ingredient(name: "Jalapeno", quantity: 3, units: .slices, type: .garnish, recipe: spicyMargarita) // Initialize sections and steps let preparationSection = RecipeSection(recipe: spicyMargarita) let preparationSteps = [ RecipeStep(instruction: "Muddle the jalapeno slices in the shaker.", section: preparationSection), RecipeStep(instruction: "Add tequila, lime juice, and agave syrup to shaker with ice.", section: preparationSection), RecipeStep(instruction: "Shake well.", section: preparationSection), RecipeStep(instruction: "Strain into a chilled glass.", section: preparationSection) ] // WHEN THE BELOW IS COMMENTED OUT, no errors, but have many missing objects. spicyMargarita.ingredients.append(contentsOf: [tequila, limeJuice, agaveSyrup, jalapeno]) spicyMargarita.sections.append(preparationSection) preparationSection.steps.append(contentsOf: preparationSteps)
0
0
187
Apr ’24