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.
Overview
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.
Usar datos migrados con 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
@ObservedResultso@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:
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.
Establecer una configuración predeterminada
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)
Pasar el objeto de configuración como un objeto de entorno
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) (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. (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.
Pasar explícitamente la configuración actualizada a un contenedor de propiedades de SwiftUI de Realm
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. (Dog.self, configuration: config) var dogs