객체 모델 변경 - SwiftUI
이 페이지의 내용
개요
객체 스키마를 업데이트할 때는 스키마 버전을 높이고 마이그레이션을 수행해야 합니다. 앱의 주요 버전 릴리스 사이에 객체 스키마를 업데이트할 수 있습니다.
실제로 마이그레이션 을 수행하는 방법에 대한 자세한 내용 은 객체 모델 변경을 참조하세요.
이 페이지에서는 SwiftUI View에서 마이그레이션된 데이터를 사용하는 방법에 중점을 둡니다.
SwiftUI와 함께 마이그레이션된 데이터 사용
마이그레이션을 수행하려면 다음을 수행합니다.
필요한 경우 스키마 를 업데이트하고 마이그레이션 차단 을 쓰기 (write) 합니다.
Realm을 초기화할 때 이 마이그레이션 로직 및/또는 업데이트된 스키마 버전을 사용하는 Realm.Configuration을 지정합니다.
여기에서 구성 객체를 전달할 수 있는 몇 가지 옵션이 있습니다. 다음을 수행할 수 있습니다.
구성을 기본 구성으로 설정합니다. 환경 주입 또는 매개변수를 통해 구성을 명시적으로 전달하지 않으면 속성 래퍼가 기본 구성을 사용합니다.
환경 삽입을 사용하여 Realm 을 사용하는 계층 구조의 첫 번째 뷰에 이 구성을 제공합니다.
@ObservedResults
또는@AsyncOpen
와 같은 구성 객체를 사용하는 Realm 속성 래퍼에 구성을 명시적으로 제공합니다.
예시
예를 예시 , 기존 객체 에 속성 을 추가할 수 있습니다. DoggoDB의 Dog
객체 에 favoriteTreat
속성 을 추가할 수 있습니다.
var favoriteTreat = ""
스키마 에 새 속성 을 추가한 후에는 스키마 버전을 증가시켜야 합니다. Realm.Configuration
는 다음과 같습니다.
let config = Realm.Configuration(schemaVersion: 2)
이 구성을 필요로 하는 계층 구조의 첫 번째 뷰에서 액세스할 수 있는 어딘가에 이 구성을 선언합니다. 이를 @main
앱 진입점 위에 선언하면 모든 곳에서 사용할 수 있지만 영역 을 처음 여는 파일 에 넣을 수도 있습니다.
기본 구성 설정
다른 Realm Swift 앱 과 동일하게 SwiftUI 앱 에서 기본값 구성을 설정하다 수 있습니다. 새 Realm.Configuration 인스턴스 를 Realm 영역 인스턴스에 할당하여 기본값 Realm 구성을 설정합니다. 클래스 속성.
// Open the default realm let defaultRealm = try! Realm() // Open the realm with a specific file URL, for example a username let username = "GordonCole" var config = Realm.Configuration.defaultConfiguration config.fileURL!.deleteLastPathComponent() config.fileURL!.appendPathComponent(username) config.fileURL!.appendPathExtension("realm") let realm = try! Realm(configuration: config)
구성 객체를 환경 객체로 전달
구성을 선언한 후에는 Realm을 여는 계층 구조의 첫 번째 뷰에 환경 객체로 구성을 주입할 수 있습니다. @ObservedResults
또는 @ObservedRealmObject
속성 래퍼(wrapper)를 사용하는 경우 이러한 뷰는 암시적으로 Realm을 열기 때문에 이 구성에 대한 액세스도 필요합니다.
.environment(\.realmConfiguration, config)
앱 이 로컬 또는 동기화된 영역 을 사용하는 경우 계층 구조에서 영역 을 여는 첫 번째 보기는 동기화 유무에 관계없이 앱 을 사용하는지 여부에 따라 달라집니다.
동기화를 사용하지 않으면 Realm 구성 환경 객체를 LocalOnlyContentView
에 직접 전달할 수 있습니다.
.environment(\.realmConfiguration, config)
다음을 사용하여 암시적으로 영역 을 엽니다.
struct LocalOnlyContentView: View { // Implicitly use the default realm's objects(Dog.self) Dog.self) var dogs ( var body: some View { if dogs.first != nil { // If dogs exist, go to the DogsView DogsView() } else { // If there is no Dog object, add one here. AddDogView() } } }
그러나 앱에서 동기화를 사용하는 경우 Realm은 @AsyncOpen
또는 @AutoOpen
속성 래퍼(wrapper)를 명시적으로 사용합니다.
/// This view opens a synced realm. struct OpenFlexibleSyncRealmView: View { // We've injected a `flexibleSyncConfiguration` as an environment value, // so `@AsyncOpen` here opens a realm using that configuration. 4000) var asyncOpen (appId: flexibleSyncAppId, timeout: var body: some View { switch asyncOpen { // Starting the Realm.asyncOpen process. // Show a progress view. case .connecting: ProgressView() // Waiting for a user to be logged in before executing // Realm.asyncOpen. case .waitingForUser: ProgressView("Waiting for user to log in...") // The realm has been opened and is ready for use. // Show the content view. case .open(let realm): // Do something with the realm UseRealmView(realm: realm) // The realm is currently being downloaded from the server. // Show a progress view. case .progress(let progress): ProgressView(progress) // Opening the Realm failed. // Show an error view. case .error(let error): ErrorView(error: error) } } }
따라서 Realm을 명시적으로 여는 뷰에 환경 객체를 전달해야 합니다. 이 경우 OpenFlexibleSyncRealmView
입니다.
기억해야 할 중요한 점은 마이그레이션 로직을 포함하는 Realm.Configuration
를 암시적 또는 명시적으로 영역 을 여는 모든 뷰 계층 구조에 전달해야 한다는 것입니다.
업데이트된 구성을 Realm SwiftUI 속성 래퍼(wrapper)에 명시적으로 전달
@ObservedResults
또는 @AutoOpen
와 같은 구성 객체를 사용하는 Realm SwiftUI 속성 래퍼에 구성 객체를 명시적으로 전달할 수 있습니다. 이 경우 DogsView
의 @ObservedResults
에 직접 전달할 수 있습니다.
// Use a `config` that you've passed in from above. Dog.self, configuration: config) var dogs (