Dados do modelo - SDK Java
Nesta página
Observação
Novas aplicações Java SDK não podem usar RealmAny
Os novos aplicativos App Services não poderão sincronizar modelos de dados com propriedades do tipo RealmAny
.
Um esquema de objetos é um objeto de configuração que define o campo e o relacionamento de um Tipo de objeto de Realm. Os aplicativos Android Realm definem esquemas de objeto com classes Java ou Kotlin usando o Realm Schemas.
Os esquemas de objeto especificam restrições em campos de objeto, como o tipo de dados de cada campo, se um campo é obrigatório e os valores de campo padrão. Os esquemas também podem definir relacionamentos entre tipos de objetos em um domínio.
A modificação do Realm Schema do aplicativo exige que você migre dados de versões mais antigas do Realm Schema para a nova versão.
Aplicativos Realm
Cada aplicação tem um Realm Schema composto por uma lista de esquemas de objetos para cada tipo de objeto que os realms desse aplicativo podem conter.
O domínio garante que todos os objetos em um domínio estejam em conformidade com o esquema do seu tipo de objeto e valida os objetos sempre que eles são criados, modificados ou excluídos.
Os aplicativos que usam o Atlas Device Sync podem definir esquemas de duas maneiras:
esquemas de objetos usando declarações de classe Kotlin e Java com o modo de desenvolvimento.
Esquemas de objetos JSON no backend do aplicativo.
Relacionamentos
Você pode modelar relacionamentos um a um no Realm com campos RealmObject . Você pode modelar campos RealmList de relacionamentos um-para-muitos e muitos-para-um . Relacionamentos inversos são o lado oposto de um relacionamento um-para-muitos ou muitos-para-um . Você pode tornar relações inversas transitáveis com a anotação @LinkingObjects em um campo RealmResults . Em uma instância de um RealmObject
, os campos de relacionamento inversos contêm o conjunto de objetos de Realm que ponto para essa instância de objeto por meio do relacionamento descrito. Você pode encontrar o mesmo conjunto de objetos Realm com uma query manual, mas o campo de relacionamento inversa reduz o código de query clichê e a capacidade de erro.
Objetos reais
Ao contrário dos objetos Java normais, que contêm seus próprios dados, um objeto Realm não contém dados. Em vez disso, Objeto de Realm leem e gravam propriedade diretamente no Realm.
As instâncias de Objeto de Realm podem ser managed ou não gerenciadas.
Os objetos gerenciados são:
persistente no Realm
sempre atualizado
Confinado por thread
geralmente mais leves do que a versão não gerenciada, pois ocupam menos espaço na heap do Java.
Objetos não gerenciados são como objetos Java comuns, pois não são persistentes e nunca são atualizados automaticamente. Você pode mover objetos não gerenciados livremente entre threads.
Você pode converter entre os dois estados usando realm.copyToRealm() e realm.copyFromRealm().
RealmProxy
As classes RealmProxy
são a maneira do Realm SDK de garantir que o Objeto de Realm não contenham quaisquer objeto. Em vez disso, o RealmProxy
de cada classe acessa os dados diretamente no reconhecimento de data center.
Para cada classe de modelo em seu projeto, o processador de anotações do Realm gera uma classe RealmProxy
correspondente. Essa classe estende sua classe de modelo e é retornada quando você chama Realm.createObject()
. Em seu código, esse objeto funciona como sua classe de modelo.
Limitações do Objeto de Realm
Objetos de Realm:
não pode conter campos que utilizam os modificadores
final
ouvolatile
(exceto para campos de relação inversa ).não pode estender nenhum objeto que não seja
RealmObject
.deve conter um construtor vazio (se sua classe não incluir nenhum construtor, o construtor vazio gerado automaticamente será suficiente)
Limitações de nomenclatura:
Os nomes das classes não podem exceder 57 caracteres.
Os nomes das classes devem ser exclusivos dentro dos módulos do domínio
Os nomes dos campos não podem exceder 63 caracteres.
Limitações de tamanho:
String
ou camposbyte[]
não podem exceder 16 MB.
Limitações de uso:
Como os objetos de Realm são ativos e podem mudar a qualquer momento, seu valor
hashCode()
pode mudar ao longo do tempo. Como resultado, você não deve utilizar instâncias doRealmObject
como uma chave em qualquer mapa ou conjunto.
Construções incrementais
O transformado de bytecode usado pelo Realm oferece suporte a compilações incrementais, mas sua aplicação exige uma reconstrução completa ao adicionar ou remover o seguinte de um campo de Objeto de Realm:
uma anotação
@Ignore
a palavra-chave
static
a palavra-chave
transient
Você pode executar uma reconstrução completa com Build > Clean Project e Build > Rebuild Project nestes casos.
Versão do esquema
Uma versão de esquema identifica o estado de um Realm Schema em um determinado momento. O Realm controla a versão do esquema de cada realm e o usa para mapear os objetos em cada realm para o esquema correto.
As versões de esquema são inteiros que você pode incluir na configuração do território quando você abre um domínio. Se um aplicativo cliente não especificar um número de versão quando abrir um domínio, o domínio assumirá como padrão a versão 0
.
Importante
Incrementar versões monotonicamente
As migrações devem atualizar um realm para uma versão superior do esquema. O Realm exibe um erro se um aplicativo cliente abrir um realm com uma versão do esquema inferior à versão atual do realm ou se a versão do esquema especificada for igual à versão atual do realm, mas incluir esquemas de objetos diferentes.
Migrações
Uma migração local é uma migração para um domínio que não é sincronizado automaticamente com outro domínio. As migrações locais têm acesso ao domínio schema, à versão e aos objetos existentes e definem a lógica que atualiza incrementalmente o domínio para sua nova versão do esquema. Para realizar uma migração local, você precisa especificar uma nova versão do esquema que seja superior à versão atual e fornecer uma função de migração ao abrir o domínio desatualizado.
Com o SDK, você pode atualizar os dados subjacentes para refletir as alterações de esquema usando migrações manuais. Durante essa migração manual, você pode definir propriedades novas e excluídas quando elas são adicionadas ou removidas do esquema. O esquema editável exposto por meio de um DynamicRealm fornece funções de conveniência para renomear campos. Isso lhe dá controle total sobre o comportamento dos seus dados durante migrações de esquemas complexos.
Dica
Migrações durante o desenvolvimento de aplicativos
Durante o desenvolvimento de um aplicativo, as classes RealmObject
podem mudar com frequência. Você pode usar Realm.deleteRealm() para excluir o arquivo de banco de dados e eliminar a necessidade de escrever uma migração completa para testar os dados.