Configurar e abrir um domínio - Realm Kotlin SDK
Nesta página
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 aplicação , bem como metadados adicionais que descrevem esses objetos. Cada Tipo de objeto de Realm tem um esquema de objetos com base em seu modelo de objetos 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.
Arquivos Realm
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 dos arquivos reais com o Realm Studio.
Se não quiser criar um arquivo .realm
ou seus arquivos auxiliares associados, você pode abrir um Realm na memória. Consulte a seção Abrir um domínio na Realm para obter mais informações.
Arquivos auxiliares
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.
Abrir 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 Realm 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 { var _id: ObjectId = ObjectId() var name: String = "" } class Person : RealmObject { var _id: ObjectId = ObjectId() var name: String = "" }
Abrir um Realm padrão
Para abrir um Realm com valores de configuração padrão, use RealmConfiguration.create(). método. Você só precisa definir um conjunto de classes de objeto como o esquema de Realm . 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 ...
Localização do arquivo padrão
Se você não definir um diretório para o arquivo de Realm , 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 )
Abrir um Realm na memória
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.
Realm uma configuração de domínio
Você pode adicionar argumentos opcionais ao RealmConfiguration
para controlar as especificidades do Realm que você gostaria de abrir, incluindo:
Definir um nome de arquivo personalizado e um caminho de arquivo
Passando uma chave de encriptação para criptografar um Realm
Compactação de um Realm para reduzir o tamanho do arquivo
Especificar uma versão do esquema ou bloco de migração ao fazer alterações no esquema
Sinalizando se o Realm deve excluir o arquivo de Realm se uma migração for necessária
Para obter mais informações sobre implementações de configuração específicas, consulte Gerenciar arquivos do 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 ...
Adicionar dados iniciais ao Realm
Você pode adicionar dados iniciais a um Realm usando um initialDataCallback. A chamada de resposta de resposta é acionada quando o Realm é 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}")
Encontre um caminho de arquivo Realm
Para localizar o caminho de um arquivo .realm
, use a propriedade realm.configuration.path :
val realmPath = realm.configuration.path Log.v("Realm path: $realmPath")
Fechar um Realm
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
.
Copiar dados para um novo domínio
Para copiar dados de um Realm existente para um novo Realm com diferentes opções de configuração, passe a nova configuração para o método Realm.writeCopyTo() método. Por exemplo, você pode copiar dados como uma forma de fazer backup de um Realm local ou converter um Realm sincronizado em um Realm 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 Realm 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, é possível copiar dados de um Realm sincronizado na memória e 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 ponto para um aplicação 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 Realm 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() }