Menu Docs

Página inicial do DocsDesenvolver aplicaçõesAtlas 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

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:

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.

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:

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 a null.

  • Encontre tarefas atribuídas a membros específicos da equipe Ali ou Jamie verificando se a propriedade assignee está em uma lista de nomes.

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:

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 true se a expressão de string à esquerda corresponder à expressão de string curinga de string à direita. Uma expressão de string curinga é uma string que usa caracteres normais com dois caracteres curinga especiais:

  • O curinga * corresponde a zero ou mais de qualquer caractere

  • O curinga ? corresponde a qualquer caractere.

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.

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.

Os exemplos nesta seção usam dois tipos de objeto de Realm: Teacher e Student.

Consulte o esquema para estas duas classes abaixo:

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.

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:

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).

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.

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.

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.

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:

← CRUD - Excluir - SDK Java