オブジェクトモデルを変更する - SwiftUI
項目一覧
注意
同期された Realm のスキーマ プロパティの変更
次のページでは、ローカル Realm のスキーマ プロパティを変更する方法を示します。 同期された Realm のスキーマ プロパティを変更する方法を学習します。
Overview
オブジェクト スキーマを更新するときは、スキーマのバージョンを増やして移行を実行する必要があります。 アプリのメジャー バージョン リリース間でオブジェクト スキーマを更新することができます。
移行を実際に実行する方法の詳細については、「オブジェクトモデルの変更 」を参照してください。
このページでは、 SwiftUI ビュー で移行されたデータを使用する方法に焦点を当てます。
SwiftUI で移行したデータを使用する
移行を実行するには、次の手順に従います。
必要に応じて、スキーマを更新し、移行ブロックを書き込みます
Realm を初期化するときに、この移行ロジックや更新されたスキーマ バージョンを使用するRealm.Configurationを指定します。
ここから、構成オブジェクトを渡すためのいくつかのオプションがあります。 ここでは、次の作業が可能です。
構成をデフォルト構成 として設定します。 環境インジェクションや パラメーターとして構成を明示的に渡さない場合、プロパティ ラッパーはデフォルト構成を使用します。
環境インジェクションを使用して、Realm を使用する階層の最初のビューにこの構成を提供します
@ObservedResults
や@AsyncOpen
などの構成オブジェクトを持つ Realm プロパティ ラッパーに構成を明示的に提供します。
例
たとえば、既存のオブジェクトにプロパティを追加したいとします。 DogoDB のDog
オブジェクトにfavoriteTreat
プロパティを追加できます。
var favoriteTreat = ""
新しいプロパティをスキーマに追加した後、スキーマ バージョンを増やす必要があります。 Realm.Configuration
は次のようになります。
let config = Realm.Configuration(schemaVersion: 2)
この構成を必要とする階層内の最初のビューがアクセスできる場所でこの構成を宣言します。 @main
アプリ エントリポイントの上でこれを宣言すると、どこでも使用できるようになりますが、Realm を最初に開く ファイルにこれを含めることもできます。
デフォルト構成の設定
SwiftUI アプリでは、他の Realm Swift アプリと同じようにデフォルト構成を設定できます。 新しい Realm.Configuration インスタンスをRealm.Configuration.defaultConfigurationに割り当てて、デフォルトの 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
プロパティ ラッパーを使用している場合、これらのビューは暗黙的に Realm を開くため、この構成へのアクセスも必要です。
.environment(\.realmConfiguration, config)
アプリでローカル Realm または Synced Realm のいずれかを使用する場合、Realm を開く階層内の最初のビューは、アプリを同期付きで使用しているか、同期なしで使用しているかによって異なります。
同期なしで、Realm 構成環境オブジェクトを直接LocalOnlyContentView
に渡すことができます。
.environment(\.realmConfiguration, config)
これは、次の使用で暗黙的に Realm を開きます。
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() } } }
ただし、アプリで Sync を使用する場合は、 @AsyncOpen
または@AutoOpen
プロパティ ラッパーを使用して明示的に Realm を明示的に使用します。
/// 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 を暗黙的または明示的に開くビュー階層に、移行ロジックを囲むRealm.Configuration
を必ず渡すことです。
更新された構成を Realm SwiftUI プロパティ ラッパーに明示的に渡す
@ObservedResults
や@AutoOpen
などの構成オブジェクトを受け取る Realm SwiftUI プロパティ ラッパーに構成オブジェクトを明示的に渡すことができます。 この場合は、 DogsView
で@ObservedResults
に直接渡すことができます。
// Use a `config` that you've passed in from above. Dog.self, configuration: config) var dogs (