Menu Docs

Página inicial do DocsDesenvolver aplicaçõesAtlas Device SDKs

Use arquivos do Realm - SDK Java

Nesta página

  • O ciclo de vida do domínio
  • Multiprocesso
  • Esquema de Realm
  • Domínios sincronizados
  • Encontre seu arquivo Realm
  • Tamanho do arquivo de Realm
  • Limite o número máximo de versões ativas
  • Compactar um domínio
  • Realms de backup e restauração
  • Módulos

Um realm é um conjunto de objetos relacionados que estão em conformidade com um esquema predefinido. Os domínios podem conter mais de um tipo de dados, desde que exista um esquema para cada tipo.

Cada domínio armazena dados em um arquivo de domínio separado que contém uma codificação binária de cada objeto no domínio. Você pode sincronizar automaticamente o domínio em vários dispositivos e configurar manipuladores de eventos reativos que chamam uma função sempre que um objeto em um domínio é criado, modificado ou excluído.

Cada instância de realm consome uma quantidade significativa de recursos. Abrir e fechar um realm são operações caras, mas manter um realm aberto também incorre em uma significativa sobrecarga de recursos. Para maximizar o desempenho do seu aplicativo, você deve minimizar o número de domínios abertos a qualquer momento e limitar o número de operações de abertura e fechamento usadas.

No entanto, abrir um domínio nem sempre é consistentemente caro. Se o domínio já estiver aberto dentro do mesmo processo ou thread, abrir uma instância adicional exigirá menos recursos:

  • Se o domínio não for aberto dentro do mesmo processo, abrir o domínio sairá caro.

  • Se o realm já estiver aberto em uma thread diferente dentro do mesmo processo, abrir o realm será menos caro, mas ainda não é trivial.

  • Se o realm já estiver aberto na mesma thread dentro do mesmo processo, a abertura do realm exigirá recursos adicionais mínimos.

Quando você abre um domínio pela primeira vez, o Realm realiza o mapeamento de memória e a validação de esquema necessários para ler e gravar dados no domínio. Instâncias adicionais desse realm na mesma thread utilizam os mesmos recursos subjacentes. As instâncias desse realm em threads separados usam alguns dos mesmos recursos subjacentes.

Quando todas as conexões com um realm são fechadas em um thread, o Realm libera os recursos de thread usados para se conectar a esse realm. Quando todas as conexões com um realm são fechadas em um processo, o Realm libera todos os recursos usados para se conectar a esse realm.

Como prática recomendada, recomendamos vincular o ciclo de vida da instância de domínio aos ciclos de vida das visualizações que observam o domínio. Por exemplo, considere um RecyclerView que exibe dados do RealmResults por um Fragment. Você poderia:

  • Abra um único domínio que contenha os dados para essa visualização no método de ciclo de vida do Fragment.onCreateView() .

  • Feche o mesmo realm no método de ciclo de vida Fragment.onDestroyView() .

Observação

Se o seu domínio for especialmente grande, buscar uma instância de domínio no Fragment.onCreateView() pode bloquear brevemente a renderização. Se abrir seu domínio no onCreateView() causar problemas de desempenho, considere gerenciar o domínio a partir do Fragment.onStart() e Fragment.onStop() .

Se várias instâncias do Fragment exigirem acesso ao mesmo conjunto de dados, você poderá gerenciar um único domínio no Activity anexado:

  • Abra o domínio no método de ciclo de vida Activity.onCreate() .

  • Feche o domínio no método de ciclo de vida Activity.onDestroy() .

Você não pode acessar domínios criptografados ou sincronizados simultaneamente a partir de diferentes processos. No entanto, os domínios locais funcionam normalmente nos processos, para que você possa ler, escrever e receber notificações de vários APIs.

Um Realm Schema é uma lista de esquemas de objeto válidos que cada um define um tipo de objeto que um aplicativo pode persistir. Todos os objetos em um realm devem estar em conformidade com o Realm Schema.

Por padrão, o SDK adiciona automaticamente todas as classes em seu projeto que derivam do RealmObject ao esquema do domínio.

Os aplicativos do cliente fornecem um Realm Schema quando abrem um domínio. Se um domínio já contiver dados, o Realm validará cada objeto existente para garantir que um esquema de objeto tenha sido fornecido para seu tipo e que atenda a todas as restrições especificadas no esquema.

Exemplo

Um domínio que contém dados básicos sobre livros em bibliotecas pode usar um esquema como o seguinte:

[
{
"type": "Library",
"properties": {
"address": "string",
"books": "Book[]"
}
},
{
"type": "Book",
"primaryKey": "isbn",
"properties": {
"isbn": "string",
"title": "string",
"author": "string",
"numberOwned": { "type": "int?", "default": 0 },
"numberLoaned": { "type": "int?", "default": 0 }
}
}
]

Um aplicativo que utiliza Atlas Device Sync pode abrir um domínio sincronizado.

Ao usar o Flexible Sync, você pode personalizar os dados que o aplicativo cliente sincroniza assinando queries. Essas queries procuram dados no backend do seu aplicativo, e o domínio do Flexible Sync sincroniza os dados que correspondem às queries. O aplicativo cliente só pode sincronizar dados em que o usuário tenha as permissões de leitura ou leitura e gravação apropriadas para acessar os dados.

Quando você usa a Sincronização baseada em partições, os domínios sincronizados representam partições de dados do Atlas. Cada domínio corresponde a um subconjunto dos dados na fonte de dados do seu aplicativo. Você pode personalizar o particionamento de dados usando a chave de partiçãodo seu aplicativo. Valores exclusivos da chave de partição, conhecidos como valores de partição, correspondem a domínios individuais.

Você pode personalizar as permissões para os dados que os domínios sincronizados podem ler e gravar de seu aplicativo ao configurar as Regras do Realm.

Para obter mais informações, consulte Configurar um realm sincronizado - Java SDK.

O Realm armazena uma versão codificada binária de cada objeto e digita um domínio em um único arquivo .realm .

O sistema de arquivos usado pelos emuladores Android não é acessível diretamente da máquina que executa o Realm Studio. Você deve baixar o arquivo do emulador antes de poder acessá-lo.

Primeiro, encontre o caminho do arquivo no emulador:

// Run this on the device to find the path on the emulator
Realm realm = Realm.getDefaultInstance();
Log.i("Realm", realm.getPath());

Em seguida, baixe o arquivo usando ADB. Você pode fazer isso enquanto o aplicativo está em execução.

> adb pull <path>

Você também pode carregar o arquivo modificado novamente usando o ADB, mas somente quando o aplicativo não estiver em execução. Carregar um arquivo modificado enquanto o aplicativo está em execução pode corromper o arquivo.

> adb push <file> <path>

Dica

Veja também: Arquivos Realm Auxiliares

O Realm cria arquivos adicionais para cada realm. Para saber mais sobre esses arquivos, consulte Realm Internals.

O Realm geralmente ocupa menos espaço no disco do que um banco de dados SQLite equivalente. No entanto, para fornecer a você uma visão consistente de seus dados, o Realm opera em múltiplas versões de um domínio. Se muitas versões de um domínio forem abertas simultaneamente, o arquivo de domínio poderá exigir espaço adicional no disco.

Essas versões ocupam uma quantidade de espaço que depende da quantidade de alterações em cada transação. Muitas transações pequenas têm a mesma sobrecarga que um pequeno número de transações grandes.

O crescimento inesperado do tamanho do arquivo geralmente acontece por um dos três motivos:

  1. Você abre um domínio em um thread em background e se esquece de fechá-lo novamente. Como resultado, o Realm retém uma referência à versão mais antiga dos dados na thread do background. Como o Realm atualiza automaticamente os domínios para a versão mais recente em threads com loopers, o thread da UI e outros threads do Looper não têm esse problema.

  2. Você tem referências a muitas versões de objetos congelados. Objetos congelados preservam a versão de um domínio que existiu quando o objeto foi congelado pela primeira vez. Se você precisar congelar um grande número de objetos, considere usar Realm.copyFromRealm() em vez disso para preservar apenas os dados necessários.

  3. Você lê alguns dados de um domínio. Em seguida, bloqueie o thread com uma operação de longa duração. Enquanto isso, você escreve muitas vezes no realm em outras threads. Isso faz com que o Realm crie muitas versões intermediárias. Você pode evitar isso por:

    • agrupamento das gravações

    • evitando deixar o domínio aberto e, de outra forma, bloquear a thread no background.

Você pode definir maxNumberOfActiveVersions() ao criar seu RealmConfiguration para lançar um IllegalStateException se seu aplicativo abrir mais versões de um domínio do que o número permitido. As versões são criadas ao executar uma transação de escrita.

O Realm remove automaticamente versões mais antigas de dados quando eles não são mais usados pelo seu aplicativo. No entanto, o Realm não libera o espaço usado por versões mais antigas de dados; em vez disso, esse espaço é usado para novas gravações no realm.

Você pode remover o espaço não utilizado compactando o arquivo de domínio:

  • Manualmente: chame compactRealm()

  • Automaticamente: especifique a opção de construtor compactOnLaunch() ao abrir a primeira conexão para um domínio em seu aplicativo Android

Importante

Compactar todos os aplicativos de produção

Todo aplicativo de produção deve implementar a compactação para reduzir periodicamente o tamanho do arquivo do realm.

O Realm persiste domínios em disco usando arquivos em seu dispositivo Android. Para fazer backup de um domínio, encontre seu arquivo de domínio e copie-o para um local seguro. Você deve fechar todas as instâncias do domínio antes de copiá-lo.

Como alternativa, você também pode usar realm.writeCopyTo() para escrever uma versão compactada de um domínio em um arquivo de destino.

Dica

Veja também:

Se você quiser fazer backup de um domínio em um local externo como o Google Drive, consulte a seguinte série de artigos: (Parte 1, Parte 2, Parte 3).

Os módulos de Realm descrevem o conjunto de objetos de Realm que podem ser armazenados em um domínio. Por padrão, o Realm cria automaticamente um módulo Realm que contém todos os objetos do Realm definidos em seu aplicativo. Você pode definir um RealmModule para restringir um realm a um subconjunto de classes definidas em um aplicativo. Se você produzir uma biblioteca que use Realm, poderá usar um módulo Realm para incluir explicitamente apenas os objetos Realm definidos na biblioteca e no Realm. Isso permite que os aplicativos que incluem sua biblioteca também usem o Realm sem gerenciar conflitos de nome de objeto e migrações com os objetos Realm definidos pela biblioteca.

← Início rápido com LiveData - SDK Java