Menu Docs
Página inicial do Docs
/ /
Atlas Device SDKs
/ / /

Alterar um modelo de objeto - SwiftUI

Nesta página

  • Visão geral
  • Usar dados migrados com SwiftUI
  • Definir uma configuração padrão
  • Passe o objeto de configuração como um objeto de ambiente
  • Passe explicitamente a configuração atualizada para um wrapper de propriedade do Realm SwiftUI

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.

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.

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:

@Persisted 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.

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)

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

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.
@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)
}
}
}

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.

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.
@ObservedResults(Dog.self, configuration: config) var dogs

Voltar

Realm Object Models