import SwiftData
@Model
class Trip {
var name: String
var destination: String
var startDate: Date
var endDate: Date
var accommodation: Accommodation?
var bucketList: [BucietListItme]? = []
var livingAccommodation: LivingAccommodation?
}
스키마(Schema): DB의 구조와 제약 조건에 관한 전반적인 명세를 기술
-> 개체의 특성인 속성(Attribute)들로 이루어진 개체(Entity), 개체 사이의 관계(Relation)에 대한 정의 및 제약조건을 기술
import SwiftData
@Model
class Trip {
// 고유성 제약
@Attribute(.unique) var name: String
var desitnation: String
var endDate: Date
var startDate: Date
// 변수가 삭제될 때 SwiftData에서 관련 항목 모두 삭제
@Relationship(.cascade) var bucketList: [BucketListItem]? = []
var living Accommodation: LivingAccommodation?
}
// In SwiftUI
import SwiftUI
import SwiftData
@main
struct TripsApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
.modelContainer(for:
[Trip.self,
LivingAccommodation.self])
)
}
}
// not using SwiftUI
import SwiftData
let container = try ModelContainer([
Trip.self,
Accommodation.self
])
let configuration = ModelConfiguration(inMemory: true, readOnly: true)
let container = try ModelContainer(
for: [Trip.self, Accommodation.self],
configurations: configuration
)
모델의 변경 사항을 관찰하고 변경 사항 수행을 위한 기능 제공
// In SwiftUI
import SwiftData
import SwiftUI
struct ContextView: View {
@Environment(\.modelContext) private var context
import SwiftData
let context = container.mainContext
import SwiftData
let context = ModelContext(container)
var trip = Trip(name: name,
destination: destination,
startDate: startDate,
endDate: endDate)
context.insert(trip)
Predicate
NSPredicate를 대체
데이터를 쿼리하고 필터링
표현식이 기본 스토리지 엔진에 매핑되지 않을 때, Predicate이 컴파일타임 오류 반환
let tripPredicate = #Predicate<Trip> {
$0.destination == "New York" &&
$0.name.contains("birthday") &&
$0.startDate > today
}
FetchDescriptor
let descriptor = FetchDescriptor<Trip>(predicate: tripPredicate)
let trips = try context.fetch(descriptor)
SortDescriptor
let descriptor = FetchDescriptor<Trip>(
sortBy: SortDescriptor(\.Trip.name),
prediate: tripPredicate
)
let trips = try context.fetch(descriptor)
Inserting / Deleting / Saving / Changing
var myTrip = Trip(name: "Birthday Trip", destination: "New York")
// ...
// 데이터 삽입
context.insert(myTrip)
// 데이터 삭제
context.delete(myTrip)
// 데이터 저장
try context.save()
import SwiftData
import SwiftUI
struct ContentView: View {
@Query(sort: \.startDate, order: .reverse) var allTrips: [Trip]
var body: some View {
List {
ForEach(allTrips) {
TripView(for: $0)
}
}
}
}
// not using SwiftUI
let context = container.mainContext
let upcomingTrips = FetchDescriptor<Trip>(
predicate: #Predicate { $0.startDate > Date.now },
sort: \.startDate
)
upcomingTrips.fetchLimit = 50
upcomingTrips.includePendingChanges = true
let results = context.fetch(upcomingTrips)
▼ 출처
https://developer.apple.com/videos/play/wwdc2023/10187/
https://developer.apple.com/documentation/swiftdata/preservingyourappsmodeldataacrosslaunches