Página inicial do Docs → Desenvolver aplicações → Atlas Device SDKs
Filtrar dados - SDK Java
Nesta página
- Mecanismo de query
- Interface fluente
- Sobre os exemplos nesta seção
- Operadores de comparação
- Operadores lógicos
- Operadores de strings
- Operadores agregados
- Filtrar, Classificar, Limitar, Único e Consultas de queries
- Sobre os exemplos nesta seção
- Filtros
- Classificar resultados
- Limitar resultados
- Resultados únicos
- Consultas em cadeia
- Consulta com linguagem de query de realm
Mecanismo de query
Para filtrar dados em seu domínio, use o mecanismo de query Realm.
Existem duas maneiras de acessar o mecanismo de consulta com o Java SDK:
Interface fluente
O SDK Java usa uma interface fluente para construir queries de múltiplas cláusulas que são passadas para o mecanismo de query.
Consulte API RealmQuery para obter uma lista completa dos métodos disponíveis.
Há vários tipos de operadores disponíveis para filtrar uma Collection do Realm. Os filtros funcionam avaliando uma expressão de operador para cada objeto na collection que está sendo filtrada. Se a expressão resolver para true
, o banco de dados do Realm incluirá o objeto na collection de resultados.
Uma expressão consiste em um dos seguintes:
O nome de uma propriedade do objeto que está sendo avaliados.
Um operador e até duas expressões de argumentos.
Uma string literal, número ou data.
Sobre os exemplos nesta seção
Os exemplos nesta seção usam um conjunto de dados simples para uma aplicação de lista de tarefas. Os dois tipos de objetos do Realm são Project
e Task
. Task
tem um nome, o nome do responsável e um sinalizador finalizado. Há também um número arbitrário de prioridade (o maior é mais importante) e o número de minutos gastos trabalhando nisso. Um Project
tem zero ou mais Tasks
.
Consulte o esquema para estas duas classes, Project
e Task
, abaixo:
Operadores de comparação
A operação mais direta em uma pesquisa é a comparação de valores.
Operador | Descrição |
---|---|
between | Avalia como true se a expressão numérica ou de data à esquerda estiver entre ou igual ao intervalo à direita. Para datas, isso é avaliado como true se a data à esquerda estiver dentro do intervalo de datas à direita. |
equalTo | Avalia para true se a expressão do lado esquerdo é igual à expressão do lado direito. |
greaterThan | Avalia como true se a expressão numérica ou de data do lado esquerdo é maior que a expressão numérica ou de data do lado direito. Com datas, avalia como true se a data do lado esquerdo é posterior à data do lado direito. |
greaterThanOrEqualTo | Avalia como true se a expressão numérica ou de data do lado esquerdo é maior ou igual à expressão numérica ou de data do lado direito. Com datas, avalia como true se a data do lado esquerdo é posterior ou igual à data do lado direito. |
in | Avalia como true se a expressão da esquerda estiver na lista da direita. |
lessThan | Avalia como true se a expressão numérica ou de data do lado esquerdo é menor que a expressão numérica ou de data do lado direito. Com datas, avalia como true se a data do lado esquerdo é anterior à data do lado direito. |
lessThanOrEqualTo | Avalia como true se a expressão numérica à esquerda for menor ou igual à expressão numérica à direita. Com datas, avalia como true se a data do lado esquerdo é anterior ou igual à data do lado direito. |
notEqualTo | Avalia como true se a expressão do lado esquerdo não é igual à expressão do lado direito. |
Exemplo
O exemplo a seguir usa operadores de comparação do mecanismo de consulta para:
Encontre tarefas de alta prioridade comparando o valor da propriedade
priority
com um número limite, acima do qual a prioridade pode ser considerada alta.Encontre tarefas recém-iniciadas ou de curta duração verificando se a propriedade
progressMinutes
está dentro de um determinado intervalo.Encontre tarefas não atribuídas encontrando tarefas onde a propriedade
assignee
é igual anull
.Encontre tarefas atribuídas a membros específicos da equipe Ali ou Jamie verificando se a propriedade
assignee
está em uma lista de nomes.
Operadores lógicos
Você pode fazer predicados compostos usando operadores lógicos.
Operador | Descrição |
---|---|
and | Avalia para true se as expressões da esquerda e da direita forem true . |
not | Nega o resultado da expressão fornecida. |
or | Avalia como true se qualquer uma das expressões retornar true . |
Exemplo
Podemos usar os operadores lógicos da linguagem de consulta para encontrar todas as tarefas concluídas de Ali. Ou seja, encontramos todas as tarefas em que o valor da propriedade assignee
é igual a "Ali" E o valor da propriedade isComplete
é true
:
Operadores de strings
Você pode comparar valores de string utilizando esses operadores de string. Curingas do tipo Regex permitem mais flexibilidade na pesquisa.
Operador | Descrição |
---|---|
beginsWith | Avalia como true se a expressão de string à esquerda começar com a expressão de string à direita. Isso é semelhante ao contains , mas só corresponde se a expressão de string à esquerda for encontrada no início da expressão de string à direita. |
contains | Avaliado como true se a expressão de string à esquerda for encontrada em qualquer lugar na expressão de string à direita. |
endsWith | Avalia como true se a expressão de string à esquerda terminar com a expressão de string à direita. Isso é semelhante ao contains , mas só corresponde se a expressão de cadeia de caracteres à esquerda for encontrada no final da expressão de cadeia de caracteres à direita. |
like | Avalia como
Por exemplo, a cadeia curinga "d?g" corresponde a "dog", "dig" e "cavg", mas não "ding", "dg" ou "a dog". |
equalTo | Avalia como true se a string esquerda for lexicograficamente igual à string direita. |
Exemplo
Usamos os operadores de cadeia de caracteres do mecanismo de consulta para encontrar projetos com um nome que comece com a letra "e" e projetos com nomes que contenham "ie":
Observação
Limitações de caracteres que não diferenciam maiúsculas de minúsculas
Os operadores de string que não diferenciam maiúsculas de minúsculas suportam somente os conjuntos de caracteres Latin Basic
, Latin Supplement
, Latin Extended A
e Latin Extended B (UTF-8 range 0–591)
. A definição do sinalizador de distinção entre maiúsculas e minúsculas em queries ao usar equalTo
, notEqualTo
, contains
, endsWith
, beginsWith
ou like
só funciona com caracteres de localidade em inglês.
Operadores agregados
Você pode aplicar um operador agregado a uma propriedade de collection de um objeto Realm. Operadores agregados atravessam uma collection e a reduzem para um único valor.
Operador | Descrição |
---|---|
average | Avalia conforme o valor médio de uma determinada propriedade numérica em uma coleção. |
count | Avalia o número de objetos na coleção fornecida. |
max | Avalia conforme o valor mais alto de uma determinada propriedade numérica em uma collection. |
min | Avalia conforme o valor mais baixo de uma determinada propriedade numérica em uma collection. |
sum | Avalia conforme a soma de uma determinada propriedade numérica em uma collection. |
Exemplo
Criamos alguns filtros para mostrar facetas diferentes dos dados:
Projetos com prioridade média de tarefas acima de 5.
Projetos de longa duração.
Filtrar, Classificar, Limitar, Único e Consultas de queries
Sobre os exemplos nesta seção
Os exemplos nesta seção usam dois tipos de objeto de Realm: Teacher
e Student
.
Consulte o esquema para estas duas classes abaixo:
Filtros
Você pode criar filtros usando os métodos do operador da interface fluente exposto pela classe RealmQuery :
Isso lhe dá uma nova instância da classe RealmResults, contendo professores com o nome "Sra. Langtree" ou "Sra. Jacobs".
RealmQuery
inclui vários métodos que podem executar queries:
findAll() bloqueia até encontrar todos os objetos que atendem às condições da query
findAllAsync() é retornado imediatamente e encontra todos os objetos que atendem às condições da query de forma assíncrona em uma thread de background
Blocos findFirst() até encontrar o primeiro objeto que atenda às condições de query
findFirstAsync() é retornado imediatamente e encontra o primeiro objeto que atende às condições da query de forma assíncrona em uma thread de background
As queries retornam uma lista de referências aos objetos do Realm correspondentes usando o tipo RealmResults.
Vincular queries
Quando fizer referência a uma propriedade de objeto, você pode usar a notação de ponto para se referir a propriedades derivadas desse objeto. Você pode fazer referência às propriedades de objetos embarcados e relacionamentos com notação de ponto.
Por exemplo, considere uma query para todos os professores com um aluno chamado "Wirt" ou "Greg":
Você pode até usar notação de ponto para consultar relacionamentos inversos:
Classificar resultados
Importante
O Realm aplica os métodos distinct()
, sort()
e limit()
na ordem que você especifica. Dependendo do conjunto de dados, isto pode alterar o resultado da query. Geralmente, você deve aplicar limit()
por último para evitar conjuntos de resultados indesejados.
Você pode definir a ordem dos resultados da query usando o método sort () :
As classificações organizam os resultados em ordem crescente por padrão. Para organizar os resultados em ordem decrescente, passe Sort.DESCENDING
como segundo argumento. Você pode resolver empates de ordem de classificação entre valores de propriedade idênticos passando uma array de propriedades em vez de uma única propriedade: no caso de um empate, Realm classifica os objetos empatados por propriedades subsequentes em ordem.
Observação
Limitações de classificação de strings
O Realm usa uma classificação não padrão para letras maiúsculas e minúsculas, classificando-as juntas em vez de primeiro classificá-las em maiúsculas. Como resultado, '- !"#0&()*,./:;?_+<=>123aAbBcC...xXyYzZ
é a ordem de classificação real no Realm. Além disso, a classificação de strings só é compatível com os conjuntos de caracteres Latin Basic
, Latin Supplement
, Latin Extended A
e Latin Extended B (UTF-8 range 0–591)
.
Limitar resultados
Você pode limitar o número de resultados da query a um número máximo específico usando o método limit() :
Collections de resultados limitadas são atualizadas automaticamente como qualquer outro resultado de query. Consequentemente, os objetos podem sair da collection à medida que os dados subjacentes são alterados.
Dica
A paginação não é necessária para Otimização de Realm
Alguns bancos de dados incentivam a paginação de resultados com limites para evitar a leitura de dados desnecessários do disco ou o uso excessivo de memória.
Como as queries do Realm são lentas, não há necessidade de tomar essas medidas. O Realm somente carrega objetos dos resultados da query quando eles são explicitamente acessados.
Dica
Notificações excluídas em resultados limitados
As notificações de collection relatam objetos como excluídos quando saem do conjunto de resultados. Isso não significa necessariamente que eles foram excluídos do domínio subjacente, apenas que não fazem mais parte do resultado da query.
Resultados únicos
Você pode reduzir os resultados da query para valores únicos para um determinado campo ou campos usando o método distinct() :
Você só pode chamar distinct()
em campos inteiros, longos, curtos e String
; outros tipos de campo lançarão uma exceção. Assim como na classificação, você pode especificar vários campos para resolver empates.
Consultas em cadeia
Você pode aplicar filtros adicionais a uma coleção de resultados ligando para o método onde() :
O método where()
retorna um RealmQuery
que você pode resolver em um RealmResults
utilizando um método find
. Os resultados filtrados só podem retornar objetos do mesmo tipo que o conjunto de resultados originais, mas de outra forma podem usar quaisquer filtros.
Consulta com linguagem de query de realm
Novidades na versão 10.4.0.
Você também pode realizar query no Realm usando o Realm Query Language, uma string baseada em linguagem de query para limitar as pesquisa ao recuperar objetos de um realm.
Você pode usar RealmQuery.rawPredicate(). Para obter mais informações sobre sintaxe, uso e limitações, consulte a referência da Realm Query Language.
O Realm Query Language pode usar os nomes de classe e de propriedade definidos nas classes do modelo Realm ou os nomes internos definidos com @RealmField
. Você pode combinar predicados brutos com outros predicados brutos ou predicados seguros por tipo criados com RealmQuery
:
Dica
Veja também: Exemplos da linguagem de query do Realm
Você também pode encontrar exemplos úteis de linguagem de query do Realm nas seguintes páginas: