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

sincronização baseada em partição - Swift SDK

Nesta página

  • Abra um Realm de sincronização baseado em partição
  • Abrir o Realm não sincronizado como um Realm sincronizado
  • Abra um Realm sincronizado como um Realm não sincronizado
  • Migrar da sincronização baseada em partição para a Flexible Sync
  • Atualizando o código do cliente após a migração

A sincronização baseada em partição é um modo mais antigo para utilizar o Atlas Device Sync com o Swift SDK Realm. Recomendamos usar o Flexible Sync para novos aplicativos. As informações nesta página são para usuários que ainda estão usando a sincronização baseada em partições.

Dica

Realm Swift SDK v10.40.0 and newer supports the ability to migrate from Partition-Based Sync to Flexible Sync. For more information, refer to: Migrate from Partition-Based Sync to Flexible Sync.

Para obter mais informações sobre sincronização baseada em partição e como configurá-la no Atlas App Services, consulte Sincronização baseada em partição na documentação do App Services.

Quando você seleciona sincronização baseada em partição para a configuração do aplicativo de backend, a implementação do cliente deve incluir um valor de partição. Esse é o valor do campo de chave de partição que você seleciona ao configurar a Sincronização baseada em partição.

O valor da partição determina quais dados o aplicativo cliente pode acessar.

Você passa no valor da partição quando abre um Realm sincronizado.

Inicialize um domínio sincronizado com uma configuração de sincronização. Isso permite que você especifique um valor de partição cujos dados devem ser sincronizados com o realm.

Na primeira vez que você fizer login e abrir um domínio sincronizado, você fará o login do usuário e passará o objeto RLMSyncConfiguration do usuário com o partitionValue desejado para +[RLMRealm realmWithConfiguration:error:].

Isso abre um domínio sincronizado no dispositivo. O domínio tenta sincronizar com seu aplicativo em segundo plano para verificar se há alterações no servidor ou carregar as alterações feitas pelo usuário.

RLMApp *app = [RLMApp appWithId:YOUR_APP_ID];
// Log in...
RLMUser *user = [app currentUser];
NSString *partitionValue = @"some partition value";
RLMRealmConfiguration *configuration = [user configurationWithPartitionValue:partitionValue];
NSError *error = nil;
RLMRealm *realm = [RLMRealm realmWithConfiguration:configuration
error:&error];
if (error != nil) {
NSLog(@"Failed to open realm: %@", [error localizedDescription]);
// handle error
} else {
NSLog(@"Opened realm: %@", realm);
// Use realm
}

Passe o objeto de configuração de um usuário conectado com o valor de partição desejado para inicializadores de domínio.

Opcionalmente, você pode especificar se um domínio deve baixar as alterações antes de abrir. Se você não especificar o comportamento de download, isso abrirá um Realm com dados que estão no dispositivo e tentará sincronizar as alterações em segundo plano.

let app = App(id: YOUR_APP_SERVICES_APP_ID)
// Store a configuration that consists of the current user,
// authenticated to this instance of your app. If there is no
// user, your code should log one in.
let user = app.currentUser
let partitionValue = "some partition value"
var configuration = user!.configuration(partitionValue: partitionValue)
// Open the database with the user's configuration.
let syncedRealm = try! Realm(configuration: configuration)
print("Successfully opened the synced realm: \(syncedRealm)")

Novidades na versão 10.23.0.

Se quiser que um domínio não sincronizado comece a sincronizar com outros dispositivos e com o backend do Atlas App Services , use o método writeCopy(configuration:) para fazer uma cópia do domínio não sincronizado para uso com uma configuração de sincronização. O exemplo abaixo cria uma cópia de um arquivo de domínio não sincronizado, com todos os seus dados existentes, que você pode usar com uma configuração de sincronização.

Depois de copiar o Realm para uso com o Sync, você pode abrir a cópia como um Realm sincronizado. Todas as alterações feitas no Realm refletirão no Arquivo de Realm e também serão propagadas para outros dispositivos e para o backend do App Services.

Observação

Somente sincronização baseada em partição

Esse método oferece suporte apenas à conversão entre um realm não sincronizado e a sincronização baseada em partição. Se seu aplicativo usa a Flexible Sync, você deve iterar manualmente pelos objetos em um território e copiá-los para o outro realm.

Dica

Se a sua aplicação acessar Realm em um contexto do async/await, marque o código com @MainActor para evitar falhas relacionadas a threading.

try await convertLocalRealmToSyncedRealm()
// Opening a realm and accessing it must be done from the same thread.
// Marking this function as `@MainActor` avoids threading-related issues.
@MainActor
func convertLocalRealmToSyncedRealm() async throws {
let app = App(id: YOUR_APP_SERVICES_APP_ID)
// Log in the user whose realm you want to open as a synced realm
let syncUser = try await app.login(credentials: Credentials.anonymous)
// Create a configuration to open the sync user's realm
var syncConfig = syncUser.configuration(partitionValue: "Your Partition Value")
syncConfig.objectTypes = [QsTask.self]
// Prepare the configuration for the user whose local realm you
// want to convert to a synced realm
var localConfig = Realm.Configuration()
localConfig.objectTypes = [QsTask.self]
// For this example, add some data to the local realm
// before copying it. No need to do this if you're
// copying a realm that already contains data.
let localRealm = addExampleData(config: localConfig)
// Create a copy of the local realm that uses the
// sync configuration. All the data that is in the
// local realm is available in the synced realm.
try! localRealm.writeCopy(configuration: syncConfig)
// Open the synced realm we just created from the local realm
let syncedRealm = try await Realm(configuration: syncConfig)
// Access the Task objects in the synced realm to see
// that we have all the data we expect
let syncedTasks = syncedRealm.objects(QsTask.self)
var frodoSyncedTasks = syncedTasks.where { $0.owner == "Frodo" }
XCTAssertEqual(frodoSyncedTasks.count, 3)
print("Synced realm opens and contains this many tasks: \(frodoSyncedTasks.count)")
// Add a new task to the synced realm, and see it in the task count
let task4 = QsTask(value: ["name": "Send gift basket to Tom Bombadil", "owner": "Frodo"])
try! syncedRealm.write {
syncedRealm.add(task4)
}
frodoSyncedTasks = syncedTasks.where { $0.owner == "Frodo" }
XCTAssertEqual(frodoSyncedTasks.count, 4)
print("After adding a task, the synced realm contains this many tasks: \(frodoSyncedTasks.count)")
// Open the local realm, and confirm that it still only contains 3 tasks
let openedLocalRealm = try await Realm(configuration: localConfig)
let localTasks = openedLocalRealm.objects(QsTask.self)
let frodoLocalTasks = localTasks.where { $0.owner == "Frodo" }
XCTAssertEqual(frodoLocalTasks.count, 3)
print("Local realm opens and contains this many tasks: \(frodoLocalTasks.count)")
XCTAssertNotEqual(frodoLocalTasks.count, frodoSyncedTasks.count)
/// Populate the local realm with some data that we'll use in the synced realm.
func addExampleData(config: Realm.Configuration) -> Realm {
// Prepare the configuration for the user whose local realm you
// want to convert to a synced realm
let localConfig = config
// Open the local realm, and populate it with some data before returning it
let localRealm = try! Realm(configuration: localConfig)
let task1 = QsTask(value: ["name": "Keep it secret", "owner": "Frodo"])
let task2 = QsTask(value: ["name": "Keep it safe", "owner": "Frodo"])
let task3 = QsTask(value: ["name": "Journey to Bree", "owner": "Frodo"])
try! localRealm.write {
localRealm.add([task1, task2, task3])
}
return localRealm
}
}

Novidades na versão 10.23.0.

Dica

Você pode pausar temporariamente uma sessão de sincronização se não quiser alterar permanentemente um domínio sincronizado para um domínio não sincronizado. Consulte: Suspender ou retomar uma sessão de sincronização.

Se quiser interromper permanentemente a sincronização de um domínio com o backend do Atlas App Services , use o método writeCopy (configuration:) para fazer uma cópia de um domínio sincronizado para uso com uma configuração não sincronizada. O exemplo abaixo cria uma cópia do arquivo realm, com todos os seus dados existentes, em um URL de arquivo que você especifica.

Este processo remove o realm_id no Realm local. Você deve incrementar a versão do esquema como se tivesse excluído uma propriedade.

Depois de copiar o Realm para uso sem Sincronizar, você pode abrir a cópia como um Realm não sincronizado. Quaisquer alterações feitas no Realm não sincronizado refletirão apenas no Arquivo de Realm local. Nenhuma alteração se propaga para outros dispositivos ou para o backend do App Services.

Observação

Somente sincronização baseada em partição

Esse método oferece suporte apenas à conversão entre um realm não sincronizado e a sincronização baseada em partição. Se seu aplicativo usa a Flexible Sync, você deve iterar manualmente pelos objetos em um território e copiá-los para o outro realm.

Dica

Se a sua aplicação acessar Realm em um contexto do async/await, marque o código com @MainActor para evitar falhas relacionadas a threading.

try await convertSyncedRealmToLocalRealm()
// Opening a realm and accessing it must be done from the same thread.
// Marking this function as `@MainActor` avoids threading-related issues.
@MainActor
func convertSyncedRealmToLocalRealm() async throws {
let app = App(id: YOUR_APP_SERVICES_APP_ID)
// Log in the user whose realm you want to open as a local realm
let syncUser = try await app.login(credentials: Credentials.anonymous)
// Create a configuration to open the seed user's realm
var syncConfig = syncUser.configuration(partitionValue: "Some Partition Value")
syncConfig.objectTypes = [QsTask.self]
// Open the realm with the Sync user's config, downloading
// any remote changes before opening.
let syncedRealm = try await Realm(configuration: syncConfig, downloadBeforeOpen: .always)
print("Successfully opened realm: \(syncedRealm)")
// Verify the data we expect in the realm
// The synced realm we are copying contains 3 tasks whose owner is "Frodo"
let syncedTasks = syncedRealm.objects(QsTask.self)
var frodoSyncedTasks = syncedTasks.where { $0.owner == "Frodo" }
XCTAssertEqual(frodoSyncedTasks.count, 3)
print("Synced realm opens and contains this many tasks: \(frodoSyncedTasks.count)")
// Construct an output file path for the local Realm
guard let outputDir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return }
// Append a file name to complete the path
let localRealmFilePath = outputDir.appendingPathComponent("local.realm")
// Construct a local realm configuration
var localConfig = Realm.Configuration()
localConfig.objectTypes = [QsTask.self]
localConfig.fileURL = localRealmFilePath
// `realm_id` will be removed in the local realm, so we need to bump
// the schema version.
localConfig.schemaVersion = 1
// Check to see if there is already a realm at the local realm file path. If there
// is already a realm there, delete it.
if Realm.fileExists(for: localConfig) {
try Realm.deleteFiles(for: localConfig)
print("Successfully deleted existing realm at path: \(localRealmFilePath)")
} else {
print("No file currently exists at path")
}
// Make a copy of the synced realm that uses a local configuration
try syncedRealm.writeCopy(configuration: localConfig)
// Try opening the realm as a local realm
let localRealm = try await Realm(configuration: localConfig)
// Verify that the copied realm contains the data we expect
let localTasks = localRealm.objects(QsTask.self)
var frodoLocalTasks = localTasks.where { $0.owner == "Frodo" }
XCTAssertEqual(frodoLocalTasks.count, 3)
print("Local realm opens and contains this many tasks: \(frodoLocalTasks.count)")
let task = QsTask(value: ["name": "Send gift basket to Tom Bombadil", "owner": "Frodo"])
try! localRealm.write {
localRealm.add(task)
}
frodoLocalTasks = localTasks.where { $0.owner == "Frodo" }
XCTAssertEqual(frodoLocalTasks.count, 4)
print("After adding a task, the local realm contains this many tasks: \(frodoLocalTasks.count)")
frodoSyncedTasks = syncedTasks.where { $0.owner == "Frodo" }
XCTAssertEqual(frodoSyncedTasks.count, 3)
print("After writing to local realm, synced realm contains this many tasks: \(frodoSyncedTasks.count)")
XCTAssertNotEqual(frodoLocalTasks.count, frodoSyncedTasks.count)
}

Você pode migrar seu Realm Mobile Sync do App Services da sincronização baseada em partição para a Flexible Sync. A migração é um processo automático que não exige alterações no código do aplicativo. A migração automática requer o Realm Swift SDK versão 10.40.0 ou mais recente.

A migração permite que você mantenha os usuários existentes do App Services e a configuração de autenticação. O Flexible Sync fornece opções de configuração de permissões mais versáteis e sincronização de dados mais granular.

Para obter mais informações sobre como migrar seu aplicativo do App Services App da Partition-Based Sync para o Flexible Sync, consulte Migrar modos de Device Sync .

A migração automática da sincronização baseada em partição para a Flexible Sync não exige nenhuma alteração no código do cliente. No entanto, para suportar essa funcionalidade, o Realm lida automaticamente com as diferenças entre os dois modos de sincronização por:

  • Criando automaticamente assinaturas de Flexible Sync para cada Tipo de objeto de Realm em que partitionKey == partitionValue.

  • Injetando um campo partitionKey em cada objeto, se ainda não existir um. Isso é necessário para a assinatura automática do Flexible Sync.

Se você precisar fazer atualizações no código do cliente após a migração, considere atualizar a base de código do cliente para remover a funcionalidade de migração oculta. Talvez você queira atualizar a base de código do cliente quando:

  • Você adiciona um novo modelo ou altera um modelo na base de código do cliente

  • Você adiciona ou altera funcionalidades que envolvem a leitura ou escrita de Objeto de Realm

  • Você deseja implementar um controle mais refinado sobre quais dados você sincroniza

Faça essas alterações para converter seu código de cliente de sincronização baseada em partição para usar o Flexible Sync:

  • Mude para um flexibleSyncConfiguration() onde você abre um Realm.

  • Adicione propriedades relevantes aos seus modelos de objetos para usar em suas assinaturas do Flexible Sync. Por exemplo, você pode adicionar uma propriedade ownerId para permitir que um usuário sincronize somente seus próprios dados.

  • Remova as assinaturas automáticas do Flexible Sync e crie manualmente as assinaturas relevantes.

Para obter exemplos de estratégias de permissões de Flexible Sync, incluindo exemplos de como modelar dados para essas estratégias, consulte o Guia de permissões de Device Sync.

Quando você migra da sincronização baseada em partição para o Flexible Sync, o Realm cria automaticamente assinaturas ocultas do Flexible Sync para seu aplicativo. Da próxima vez que adicionar ou alterar subscrições, recomendamos que você:

  1. Remova as assinaturas geradas automaticamente.

  2. Adicione manualmente as assinaturas relevantes na base de código do cliente.

Isso permite que você veja toda a sua lógica de assinatura junto em sua base de código para futura iteração e depuração.

Para obter mais informações sobre as assinaturas Flexible Sync geradas automaticamente, consulte Migrar aplicativo cliente para Flexible Sync.

Voltar

Transmitir Dados para o Atlas

Próximo

Realm no Playgrounds do Xcode