Docs Menu

オブジェクトモデルを変更する - SwiftUI

注意

同期された Realm のスキーマ プロパティの変更

次のページでは、ローカル Realm のスキーマ プロパティを変更する方法を示します。 同期された Realm のスキーマ プロパティを変更する方法を学習します。

オブジェクト スキーマを更新するときは、スキーマのバージョンを増やして移行を実行する必要があります。 アプリのメジャー バージョン リリース間でオブジェクト スキーマを更新することができます。

移行を実際に実行する方法の詳細については、「オブジェクトモデルの変更 」を参照してください。

このページでは、 SwiftUI ビュー で移行されたデータを使用する方法に焦点を当てます。

移行を実行するには、次の手順に従います。

  • 必要に応じて、スキーマを更新し、移行ブロックを書き込みます

  • Realm を初期化するときに、この移行ロジックや更新されたスキーマ バージョンを使用するRealm.Configurationを指定します。

ここから、構成オブジェクトを渡すためのいくつかのオプションがあります。 ここでは、次の作業が可能です。

  • 構成をデフォルト構成 として設定します。 環境インジェクションや パラメーターとして構成を明示的に渡さない場合、プロパティ ラッパーはデフォルト構成を使用します。

  • 環境インジェクションを使用して、Realm を使用する階層の最初のビューにこの構成を提供します

  • @ObservedResults@AsyncOpenなどの構成オブジェクトを持つ Realm プロパティ ラッパーに構成を明示的に提供します。

たとえば、既存のオブジェクトにプロパティを追加したいとします。 DogoDB のDogオブジェクトにfavoriteTreatプロパティを追加できます。

@Persisted 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)
@ObservedResults(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.
@AsyncOpen(appId: flexibleSyncAppId, timeout: 4000) var asyncOpen
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を必ず渡すことです。

@ObservedResults@AutoOpenなどの構成オブジェクトを受け取る Realm SwiftUI プロパティ ラッパーに構成オブジェクトを明示的に渡すことができます。 この場合は、 DogsView@ObservedResultsに直接渡すことができます。

// Use a `config` that you've passed in from above.
@ObservedResults(Dog.self, configuration: config) var dogs