我不明白应该如何使用SwiftData建立这种关系

问题描述 投票:0回答:1

在我的测试项目中,用户插入一个具有目的地机场和到达机场的航班,这是我的代码:

我的航班和机场之间的关系一定有问题,但不知道如何编写这种关系以及如何保存我的航班:

在以下代码中,用户选择出发机场和到达机场并保存它,出于某种不清楚的原因,在我选择例如 depApt“icao1”和到达机场“icao2”后,我保存了航班,但保存的航班已更改 dep 机场.

希望有人可以尝试以下代码:

import Foundation
import SwiftData

@Model
class Flight {
    var id : UUID
    @Relationship(deleteRule:.noAction, inverse: \Airport.flight) var departure : Airport?
    @Relationship(deleteRule:.noAction, inverse: \Airport.flight) var arrival : Airport?
    
    var timestamp: Date
  
    init(id: UUID, departure: Airport? = nil, arrival: Airport? = nil, timestamp: Date) {
        self.id = id
        self.departure = departure
        self.arrival = arrival
        self.timestamp = timestamp
    }
}

@Model
class Airport {
    var id: UUID
    @Attribute(.unique) var icao: String
    var flight : Flight?

    init(id: UUID, icao: String, flight: Flight? = nil) {
        self.id = id
        self.icao = icao
        self.flight = flight
    }
}


//ContentView:



struct ContentView: View {
    @Environment(\.modelContext) private var mc
  

    var body: some View {
        
        TabView {
            
            Flights()
                .tabItem {
                    Label("Flights", systemImage: "airplane")
                }
            AirportsList()
                .tabItem {
                    Label("Airports", systemImage: "house")
                }
        }
    }

}

// Flight view



struct Flights: View {
    @Environment(\.modelContext) private var mc
    
    @Query var flights : [Flight]
    
    @State var openSheet = false
    
    @State var depApt : Airport?
    @State var arrApt : Airport?
    
   
    var body: some View {
        NavigationStack{
            List{
                ForEach(flights) { flt in
                    HStack{
                        VStack(alignment:.leading){
                            Text("Departure")
                            Text(flt.departure?.icao ?? "")
                        }
                        Spacer()
                        VStack(alignment:.trailing){
                            Text("Arrival")
                            Text(flt.arrival?.icao ?? "")
                        }
                    }
                }
            }
            .toolbar {
                Button("Add") {
                    openSheet.toggle()
                }
            }
            .sheet(isPresented: $openSheet, content: {
                NavigationStack{
                    Form{
                        
                        NavigationLink {
                            AirportsPick(picked: $depApt)
                        } label: {
                            Text("DEP ICAO:").foregroundStyle(.secondary)
                            Spacer()
                            Text(depApt?.icao ?? "")
                        }
                        
                        
                        NavigationLink {
                            AirportsPick(picked: $arrApt)
                        } label: {
                            Text("ARR ICAO:").foregroundStyle(.secondary)
                            Spacer()
                            Text(arrApt?.icao ?? "")
                        }
                        
                        Button("Save") {
                            let flight = Flight(id: UUID(), departure: depApt, arrival: arrApt, timestamp: Date())
                            mc.insert(flight)
                            
                            openSheet.toggle()
                        }.tint(.red)
                    }
                }.onAppear(perform: {
                    depApt = nil
                    arrApt = nil
                })
                
            })
        }
    }
    
}

//Airport Pick

struct AirportsPick: View {
    @Environment(\.modelContext) private var mc
    @Environment(\.dismiss) private var dismiss
    @Query var airports : [Airport]
    
    @Binding var picked: Airport?
    
    var body: some View {
        NavigationStack{
            List{
                ForEach(airports) { apt in
                    Button {
                        picked = apt
                        dismiss()
                    } label: {
                        Text(apt.icao)
                    }

                }
            }
            
        }
     
    }
}

import SwiftUI
import SwiftData

struct AirportsList: View {
    @Environment(\.modelContext) private var mc
    
    @Query var airports : [Airport]
    

    
    var body: some View {
        NavigationStack{
            List{
                ForEach(airports) { apt in
                    Text(apt.icao)
                }
            }
            .toolbar {
                Button("Generate Airports") {
                    if airports.isEmpty{
                        addAirports()
                    }
                }
            }
        }
     
    }
    func addAirports(){
       
        for i in 1...10 { // make some fake airport
            let icao = "ICAO: \(i)"
            let airport = Airport(id: UUID(), icao: icao)
            mc.insert(airport)
        }
        
    }
}

swift swiftui core-data relational-database swift-data
1个回答
0
投票

什么是机场?这是一个每天都有许多飞机起飞和到达的地方,所以你必须有很多航班才能到达机场。

@Model
class Airport {
    var id: UUID
    @Attribute(.unique) var icao: String
    var flights : [Flight]

    init(id: UUID, icao: String) {
        self.id = id
        self.icao = icao
        self.flights = []
    }
}

请注意,我们没有在 init 中包含关系的属性。

同时更改

Flight
型号

@Model
class Flight {
    var id : UUID
    @Relationship(deleteRule:.noAction, inverse: \Airport.flights) var departure : Airport?
    @Relationship(deleteRule:.noAction, inverse: \Airport.flights) var arrival : Airport?
    
    var timestamp: Date
  
    init(id: UUID, timestamp: Date) {
        self.id = id
        self.departure = nil
        self.arrival = nil
        self.timestamp = timestamp
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.