Alterar um modelo de objeto - SwiftUI
Nesta página
Observação
Modificar Propriedades do Esquema de um Domínio Sincronizado
A página seguinte demonstra como modificar as propriedades do esquema de um Realm local. Saiba como modificar as propriedades do esquema de um Realm sincronizado.
Visão geral
Ao atualizar o esquema de objetos, você deve incrementar a versão do esquema e executar uma migração. Você pode atualizar seu esquema de objetos entre as versões principais do seu aplicativo.
Para obter informações sobre como realmente realizar a migração, consulte: Alterar um modelo de objeto.
Esta página se concentra em como usar dados migrados em visualizações SwiftUI.
Usar dados migrados com SwiftUI
Para realizar uma migração:
Atualize seu esquema e escreva um bloco de migração, se necessário
Especifique um Realm.Configuration que use essa lógica de migração e/ou versão atualizada do esquema ao inicializar seu Realm.
A partir daqui, você tem algumas opções para passar o objeto de configuração. Você pode:
Defina a configuração como a configuração padrão. Se você não passar explicitamente a configuração por meio de injeção de ambiente ou como parâmetro, os wrappers de propriedade usarão a configuração padrão.
Use a injeção de ambiente para fornecer essa configuração à primeira visualização em sua hierarquia que usa o Realm
Forneça explicitamente a configuração para um wrapper de propriedade Realm que recebe um objeto de configuração, como
@ObservedResults
ou@AsyncOpen
.
Exemplo
Por exemplo, você pode querer adicionar uma propriedade a um objeto existente . Poderemos adicionar uma propriedade favoriteTreat
ao objeto Dog
no DoggoDB:
var favoriteTreat = ""
Depois de adicionar sua nova propriedade ao esquema, você deve incrementar a versão do esquema. Seu Realm.Configuration
pode ter a seguinte aparência:
let config = Realm.Configuration(schemaVersion: 2)
Declare essa configuração em algum lugar acessível à primeira visualização da hierarquia que precisa dela. Declarar isso acima do ponto de entrada do aplicativo @main
o torna disponível em todos os lugares, mas você também pode colocá-lo no arquivo onde abre um Realm pela primeira vez.
Definir uma configuração padrão
Você pode definir uma configuração padrão em um aplicativo SwiftUI igual a qualquer outro aplicativo Realm Swift . Defina a configuração de Realm padrão atribuindo uma nova instância de Realm.Configuration ao Realm.Configuration.defaultConfiguration propriedade de classe .
// 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)
Passe o objeto de configuração como um objeto de ambiente
Depois de declarar a configuração, você pode injetá-la como um objeto de ambiente na primeira visualização em sua hierarquia que abre um Realm. Se você estiver usando os wrappers de propriedade @ObservedResults
ou @ObservedRealmObject
, essas visualizações abrirão implicitamente um Realm, portanto, elas também precisam de acesso a essa configuração.
.environment(\.realmConfiguration, config)
Se a sua aplicação utilizar um Realm local ou Sincronizado, a primeira visualização na hierarquia que abre um Realm varia dependendo se você está usando o aplicativo com ou sem Sincronização.
Sem sincronização, você pode passar o objeto de ambiente de configuração do realm diretamente para o LocalOnlyContentView
:
.environment(\.realmConfiguration, config)
Que abre um Realm implicitamente com:
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() } } }
No entanto, quando seu aplicativo usa a Sync, você usa o Realm explicitamente usando o wrapper de propriedade @AsyncOpen
ou @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. 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) } } }
Portanto, você deve passar o objeto de ambiente para a visualização que abre explicitamente o domínio. Neste caso, o OpenFlexibleSyncRealmView
.
O importante a ser lembrado é certifique-se de passar o Realm.Configuration
que engloba sua lógica de migração para qualquer hierarquia de visualização que implícita ou explicitamente abra um Realm.
Passe explicitamente a configuração atualizada para um wrapper de propriedade do Realm SwiftUI
Você pode passar explicitamente o objeto de configuração para um wrapper de propriedade do Realm SwiftUI que usa um objeto de configuração, como @ObservedResults
ou @AutoOpen
. Nesse caso, você pode passá-lo diretamente para @ObservedResults
em nosso DogsView
.
// Use a `config` that you've passed in from above. Dog.self, configuration: config) var dogs (