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

Configurar e abrir um domínio - Realm Kotlin SDK

Nesta página

  • Arquivos Realm
  • Arquivos auxiliares
  • Abrir um Realm
  • Abrir um Realm padrão
  • Abrir um Realm na memória
  • Realm uma configuração de domínio
  • Adicionar dados iniciais ao Realm
  • Encontre um caminho de arquivo Realm
  • Fechar um Realm
  • Copiar dados para um novo domínio

Esta página descreve os arquivos do domínio e como configurar, abrir e fechar um domínio que persiste os dados apenas localmente. Para abrir um domínio que sincroniza dados com Atlas utilizando a Device Sync, consulte Abrir um Realm Sincronizado.

Um realm é a estrutura de dados principal usada para organizar dados no Realm. Cada realm é uma coleção de objetos de Realm: os objetos que você usa em seu aplicativo, bem como metadados adicionais que descrevem esses objetos. Cada tipo de objeto do Realm tem um esquema de objeto com base em seu modelo de objeto definido.

Um esquema de realm é uma lista dos esquemas de objeto válidos que um realm pode conter. Você especifica o esquema quando abre o domínio. Se um domínio já contiver dados quando você abri-lo, o Realm validará cada objeto para garantir que um esquema de objeto tenha sido fornecido para seu tipo e que atenda a todas as restrições especificadas no esquema.

O Realm armazena uma versão codificada binariamente de cada objeto e digita um domínio em um único arquivo .realm . Quando você abre um domínio, o Realm cria o arquivo .realm se ele ainda não existir. O arquivo está localizado em um caminho específico, que você pode definir ao abrir o domínio.

Dica

Trabalhe com arquivos reais no Realm Realm Studio

Você pode abrir, visualizar e editar o conteúdo de arquivos de domínio com extensão .

Se você não quiser criar um arquivo .realm ou seus arquivos auxiliares associados, poderá abrir um domínio na memória. Consulte a seção Abrir um domínio na memória para obter mais informações.

O Realm cria arquivos adicionais para cada realm:

  • arquivos realm, com sufixo com "realm", por exemplo default.realm: contém dados de objeto.

  • lock, com sufixo "lock", por exemplo default.realm.lock: acompanhe quais versões dos dados em um domínio estão ativamente em uso. Isso impede que o domínio recupere espaço de armazenamento que ainda é usado por um aplicativo cliente.

  • arquivos de nota, com sufixo com "nota", por exemplo default.realm.note: ative as notificações entre threads e entre processos.

  • arquivos de gerenciamento, com sufixo de "gerenciamento", por exemplo default.realm.management: gerenciamento de estado interno.

Excluir esses arquivos tem implicações importantes. Para obter mais informações sobre a exclusão de .realm ou arquivos auxiliares, consulte: Excluir um Realm.

Para abrir um domínio, crie um objeto RealmConfiguration que define os detalhes de um domínio. Em seguida, passe o RealmConfiguration resultante para Realm.open().

Você pode abrir um realm com valores de configuração padrão ou pode construir um RealmConfiguration com opções de configuração adicionais. No entanto, você deve passar um parâmetro de esquema que inclua todas as classes de objeto que deseja usar no domínio.

Depois de abrir o domínio com a configuração desejada, você pode ler e escrever dados com base no esquema definido.

Os exemplos nesta página referem-se aos seguintes objetos de Realm:

class Frog : RealmObject {
@PrimaryKey
var _id: ObjectId = ObjectId()
var name: String = ""
}
class Person : RealmObject {
@PrimaryKey
var _id: ObjectId = ObjectId()
var name: String = ""
}

Para abrir um domínio com valores de configuração padrão, use RealmConfiguration.create(). método. Você só precisa definir um conjunto de classes de objetos como o esquema de domínio. Em seguida, passe o RealmConfiguration para Realm.open().

O exemplo seguinte abre um arquivo default.realm no caminho padrão com um esquema que inclui as classes Frog e Person :

// Creates a realm with default configuration values
val config = RealmConfiguration.create(
// Pass object classes for the realm schema
schema = setOf(Frog::class, Person::class)
)
// Open the realm with the configuration object
val realm = Realm.open(config)
Log.v("Successfully opened realm: ${realm.configuration.name}")
// ... use the open realm ...

Se você não definir um diretório para o arquivo de domínio, o local de armazenamento de aplicativo padrão para a plataforma será usado. Você pode encontrar o diretório padrão para sua plataforma com o seguinte:

  • Android: Context.getFiles()

  • JVM: System.getProperty("user.dir")

  • macOS: platform.Foundation.NSFileManager.defaultManager.currentDirectoryPath

  • iOS:

    NSFileManager.defaultManager.URLForDirectory(
    NSDocumentDirectory,
    NSUserDomainMask,
    null,
    true,
    null
    )

Você pode abrir um realm inteiramente na memória, que não cria um arquivo .realm ou seus arquivos auxiliares associados. Em vez disso, o SDK armazena objetos na memória enquanto o realm está aberto e, em seguida, descarta os dados quando todas as instâncias são fechadas.

Para abrir um domínio que é executado sem ser gravado em um arquivo, construa um RealmConfiguration com o RealmConfiguration.Builder utilizando a propriedade inMemory . Em seguida, passe o RealmConfiguration resultante para Realm.open():

// Create the in-memory realm configuration
val config = RealmConfiguration.Builder(
schema = setOf(Frog::class, Person::class)
)
.inMemory()
.build()
// Open the realm with the configuration object
val realm = Realm.open(config)
Log.v("Successfully opened an in-memory realm")
// ... use the open realm ...

Observação

Os domínios na memória não são persistentes

Como os realms na memória não são persistentes, certifique-se de ter pelo menos uma instância aberta do realm enquanto quiser acessar os dados. Depois de fechar a última instância de um domínio na memória, os dados não estarão mais disponíveis.

Você pode adicionar argumentos opcionais ao RealmConfiguration para controlar as especificidades do domínio que você gostaria de abrir, incluindo:

Para obter mais informações sobre implementações de configuração específicas, consulte Gerenciar arquivos Realm - Kotlin SDK.

Para configurar um realm com valores não padrão, crie o RealmConfiguration por meio de RealmConfiguration.Builder.build() e passar quaisquer propriedades que você queira definir. Em seguida, passe o RealmConfiguration resultante para Realm.open().

No exemplo a seguir, o RealmConfiguration especifica um nome personalizado e diretório ("my-directory-path/myRealmName.realm") e chave de criptografia:

// Create a realm configuration with configuration builder
// and pass all optional arguments
val config = RealmConfiguration.Builder(
schema = setOf(Frog::class, Person::class)
)
.name("myRealmName.realm")
.directory("my-directory-path")
.encryptionKey(myEncryptionKey)
.build()
// Open the realm with the configuration object
val realm = Realm.open(config)
Log.v("Successfully opened realm: ${realm.configuration.name}")
// ... use the open realm ...

Você pode adicionar dados iniciais a um domínio usando um initialDataCallback. A chamada de resposta é acionada quando o domínio é aberto pela primeira vez.

val config = RealmConfiguration.Builder(
schema = setOf(Frog::class, Person::class)
)
.initialData {
copyToRealm(Frog().apply { name = "Kermit" })
copyToRealm(Person().apply { name = "Jim Henson" })
}
.build()
val realm = Realm.open(config)
Log.v("Successfully opened realm: ${realm.configuration.name}")
// Opened realm includes the initial data
val initialFrog = realm.query<Frog>().find().first()
val initialPerson = realm.query<Person>().find().first()
Log.v("Realm initialized with: ${initialFrog.name} and ${initialPerson.name}")

Para localizar o caminho de um arquivo .realm , use a propriedade realm.configuration.path :

val realmPath = realm.configuration.path
Log.v("Realm path: $realmPath")

Você fecha um domínio com realm.close(). Este método bloqueia até que todas as transações de escrita no domínio tenham sido concluídas.

realm.close()

Aviso

Feche Realms para evitar vazamentos de memória

É importante fechar a instância do realm para recursos gratuitos. Não fechar realms pode levar a um OutOfMemoryError.

Para copiar dados de um domínio existente para um novo domínio com diferentes opções de configuração, passe a nova configuração para o método Realm.writeCopyTo() . Por exemplo, você pode copiar dados como uma forma de fazer backup de um domínio local ou converter um domínio sincronizado em um domínio local.

Você pode copiar dados para um domínio que usa a mesma configuração:

  • Realm local para domínio local

  • Realm na memória para domínio na memória

  • Realm sincronizado para realm sincronizado

Você pode copiar dados para um domínio que usa configurações de sincronização diferentes:

  • Realm local para domínio de sincronização baseada em partição

  • Realm sincronizado com o domínio local

  • Realm sincronizado com um Realm sincronizado para um usuário diferente

Aviso

Você não pode copiar dados de um domínio local para um domínio do Flexible Sync. Você não pode copiar entre diferentes tipos de configuração de sincronização, por exemplo, sincronização baseada em partição para Flexible Sync.

Você também pode combinar alterações na configuração. Por exemplo, você pode copiar dados de um realm sincronizado na memória não criptografado para um realm local criptografado.

Algumas considerações adicionais a serem lembradas ao usar Realm.writeCopyTo():

  • O arquivo de destino já não pode existir.

  • Não é permitido copiar um realm dentro de uma transação de escrita ou durante uma migração.

  • Ao usar o Device Sync, você deve sincronizar todas as alterações locais com o servidor antes que a cópia seja gravada. Isso garante que o arquivo possa ser usado como ponto de partida para um aplicativo recém-instalado. O Realm apresenta um erro se houver carregamentos pendentes.

    Você pode usar uploadAllLocalChanges() e downloadAllServerChanges() para garantir que todos os processos de sincronização sejam concluídos.

Exemplo

Copiar dados do Flexible Sync Realm para o Local Realm

// Instantiate the synced realm with your App ID
val app = App.create(YOUR_APP_ID)
runBlocking {
val user = app.login(credentials)
// Create the synced realm configuration
val syncConfig = SyncConfiguration.Builder(user, setOf(Frog::class))
.initialSubscriptions { realm ->
add(realm.query<Frog>(),"all-frogs")
}
.build()
// Open the synced realm and add data to it
val syncRealm = Realm.open(syncConfig)
Log.v("Successfully opened realm: ${syncRealm.configuration.name}")
syncRealm.write {
this.copyToRealm(Frog().apply {
name = "Kermit"
})
}
// Wait for write to sync
syncRealm.syncSession.uploadAllLocalChanges(30.seconds)
// Create the local realm
val localConfig = RealmConfiguration.Builder(setOf(Frog::class))
.name("local.realm")
.build()
// Copy data from synced realm to the new realm
syncRealm.writeCopyTo(localConfig)
// Close the synced realm when you're done copying
syncRealm.close()
// Open the new local realm
val localRealm = Realm.open(localConfig)
// Copied Frog object is available in the new realm
val frog = localRealm.query<Frog>().find().first()
Log.v("Copied Frog: ${frog.name}")
localRealm.close()
}

Você também pode incluir uma nova chave de criptografia na configuração do realm copiado ou remover a chave de criptografia da nova configuração.

Exemplo

Copiar dados de não criptografados para Realmcriptografado

runBlocking {
// Create the unencrypted realm
val unencryptedConfig = RealmConfiguration.Builder(setOf(Frog::class))
.name("unencrypted.realm")
.build()
// Open the realm and add data to it
val unencryptedRealm = Realm.open(unencryptedConfig)
unencryptedRealm.write {
this.copyToRealm(Frog().apply {
name = "Kermit"
})
}
// ... Generate encryption key ...
// Create the encrypted realm
val encryptedConfig = RealmConfiguration.Builder(setOf(Frog::class))
.name("encrypted.realm")
.encryptionKey(encryptionKey)
.build()
// Copy data from `unencryptedRealm` to the new realm
// Data is encrypted as part of the copy process
unencryptedRealm.writeCopyTo(encryptedConfig)
// Close the original realm when you're done copying
unencryptedRealm.close()
// Open the new encrypted realm
val encryptedRealm = Realm.open(encryptedConfig)
// Copied Frog object is available in the new realm
val frog = encryptedRealm.query<Frog>().find().first()
Log.v("Copied Frog: ${frog.name}")
encryptedRealm.close()
}

Exemplo

Copiar dados da memória para o domínio local

runBlocking {
// Create the in-memory realm
val inMemoryConfig = RealmConfiguration.Builder(setOf(Frog::class))
.name("inMemory.realm")
.inMemory()
.build()
// Open the realm and add data to it
val inMemoryRealm = Realm.open(inMemoryConfig)
inMemoryRealm.write {
this.copyToRealm(Frog().apply {
name = "Kermit"
})
}
// Create the local realm
val localConfig = RealmConfiguration.Builder(setOf(Frog::class))
.name("local.realm")
.build()
// Copy data from `inMemoryRealm` to the new realm
inMemoryRealm.writeCopyTo(localConfig)
// Close the original realm when you're done copying
inMemoryRealm.close()
// Open the new local realm
val localRealm = Realm.open(localConfig)
// Copied Frog object is available in the new realm
val frog = localRealm.query<Frog>().find().first()
Log.v("Copied Frog: ${frog.name}")
localRealm.close()
}

Voltar

Modelar dados com o Device Sync

Próximo

Ler & gravar dados