Docs Menu
Docs Home
/ /
Datos del modelo

Cambiar un modelo de objeto - SwiftUI

Nota

Modificar las propiedades del esquema de un dominio sincronizado

La siguiente página muestra cómo modificar las propiedades del esquema de un dominio local. Aprenda a... modificar las propiedades del esquema de un reino sincronizado.

Al actualizar el esquema de objetos, debe incrementar la versión del esquema y realizar una migración. Puede actualizar el esquema de objetos entre versiones principales de su aplicación.

Para obtener información sobre cómo realizar la migración, consulte: Cambiar un modelo de objeto.

Esta página se centra en cómo utilizar datos migrados en las vistas SwiftUI.

Para realizar una migración:

  • Actualice su esquema y escriba un bloque de migración, si es necesario

  • Especifique una Realm.Configuration que utilice esta lógica de migración y/o versión de esquema actualizada cuando inicialice su reino.

Desde aquí, tienes varias opciones para pasar el objeto de configuración. Puedes:

  • Establezca la configuración como predeterminada. Si no la pasa explícitamente mediante inyección de entorno o como parámetro, los contenedores de propiedades usarán la configuración predeterminada.

  • Utilice la inyección de entorno para proporcionar esta configuración a la primera vista de su jerarquía que utiliza Realm

  • Proporcione explícitamente la configuración a un contenedor de propiedades de Realm que toma un objeto de configuración, como @ObservedResults o @AsyncOpen.

Ejemplo

Por ejemplo, podría querer agregar una propiedad a un objeto existente. Podríamos agregar una propiedad favoriteTreat al objeto Dog en DoggoDB:

@Persisted var favoriteTreat = ""

Después de agregar la nueva propiedad al esquema, debe incrementar la versión del esquema. Su Realm.Configuration podría verse así:

let config = Realm.Configuration(schemaVersion: 2)

Declare esta configuración en un lugar accesible para la primera vista de la jerarquía que la necesite. Declararla sobre el punto de entrada @main de la aplicación la hace disponible en todas partes, pero también podría colocarla en el archivo donde abra un dominio por primera vez.

Puedes establecer una configuración predeterminada en una aplicación SwiftUI, igual que en cualquier otra aplicación Swift de Realm. Para establecer la configuración predeterminada, asigna una nueva instancia de Realm.Configuration a la propiedad de clase Realm.Configuration.defaultConfiguration.

// 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)

Una vez declarada la configuración, puede inyectarla como un objeto de entorno en la primera vista de su jerarquía que abra un dominio. Si utiliza los contenedores de propiedades @ObservedResults o @ObservedRealmObject, estas vistas abren implícitamente un dominio, por lo que también necesitan acceder a esta configuración.

.environment(\.realmConfiguration, config)

Si tu aplicación usa un reino local o sincronizado, la primera vista en la jerarquía que abre un reino varía dependiendo de si estás usando la aplicación con o sin sincronización.

Sin sincronización, puedes pasar el objeto de entorno de configuración del reino directamente a LocalOnlyContentView:

.environment(\.realmConfiguration, config)

Lo cual abre un reino implícito con:

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()
}
}
}

Sin embargo, cuando tu aplicación usa Sync, usas el dominio explícitamente usando el contenedor de propiedad @AsyncOpen o @AutoOpen:

/// 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)
}
}
}

Por lo tanto, debe pasar el objeto de entorno a la vista que abre explícitamente el dominio. En este caso, OpenFlexibleSyncRealmView.

Lo importante a recordar es asegurarse de pasar el Realm.Configuration que abarca su lógica de migración a cualquier jerarquía de vistas que abra implícita o explícitamente un reino.

Puedes pasar explícitamente el objeto de configuración a un contenedor de propiedades de Realm SwiftUI que acepte un objeto de configuración, como @ObservedResults o @AutoOpen. En este caso, podrías pasarlo directamente a @ObservedResults en nuestro DogsView.

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

Volver

Modelos de objetos de reino

En esta página