CRUD - Leitura - C++ SDK
Nesta página
- Leia as características
- Os resultados não são cópias
- Os resultados são preguiçosos
- As referências são retidas
- Limitando resultados da consulta
- Paginação
- Ler objetos de domínio
- Consultar todos os objetos de dado específico
- Filtrar consultas com base nas propriedades do objeto
- Operadores de query suportados
- Verificar o tamanho do conjunto de resultados e os resultados de acesso
- Ler uma propriedade de Mapa
- Ler uma propriedade de conjunto
- Classificar listas e resultados da query
Você pode reler os dados armazenados no Realm encontrando, filtrando e ordenando objetos.
Uma leitura de um reino geralmente consiste nas seguintes etapas:
Obtenha todos os objeto de um determinado tipo do Realm.
Opcionalmente, filtre os resultados.
As operações de query retornam uma coleção de resultados. Essas coleções estão ativas, o que significa que elas sempre contêm os resultados mais recentes da consulta associada.
Leia as características
Projete os padrões de acesso a dados da sua aplicação em torno dessas três principais características de leitura para ler os dados da forma mais eficiente possível.
Os resultados não são cópias
Os resultados de uma query não são cópias dos seus dados. A modificação dos resultados de uma query modifica diretamente os dados no disco. Esse mapeamento de memória também significa que os resultados são ao vivo: ou seja, eles sempre refletem o estado atual no disco.
Os resultados são preguiçosos
O Realm só executa uma query quando você realmente solicita os resultados dessa query. Com essa avaliação preguiçosa, você consegue escrever um código de alto desempenho para lidar com grandes conjuntos de dados e queries complexas. Você pode encadear várias operações de filtro sem exigir trabalho extra para processar o estado intermediário.
As referências são retidas
Uma vantagem do modelo de objeto do Realm é que o Realm retém automaticamente todos os relacionamentos de um objeto como referências diretas. Isso permite que você percorra o gráfico de relacionamento diretamente por meio dos resultados de uma query.
Uma referência direta, ou ponteiro, permite que você acesse diretamente as propriedades de um objeto relacionado por meio da referência.
Outros bancos de dados geralmente copiam objetos do armazenamento do banco de dados para a memória do aplicativo quando você precisa trabalhar com eles diretamente. Como os objetos do aplicativo contêm referências diretas, você tem uma opção: copiar o objeto referido por cada referência direta para fora do banco de dados, caso seja necessário, ou apenas copiar a chave estrangeira de cada objeto e consultar o objeto com essa chave, se ele for acessado. Se você optar por copiar os objetos referenciados para a memória do aplicativo, poderá usar muitos recursos para objetos que nunca são acessados, mas se optar por copiar apenas a chave estrangeira, as pesquisas de objetos referenciados poderão causar lentidão no aplicativo.
O Realm contorna tudo isso com objetos ativos de cópia zero. Os acessadores de objeto de realm apontam diretamente para o armazenamento de banco de dados usando o mapeamento de memória, portanto não há distinção entre os objetos no Realm e os resultados da consulta na memória do aplicativo. Por isso você pode percorrer referências diretas em um domínio inteiro a partir de qualquer resultado de consulta.
Limitando resultados da consulta
Como resultado da avaliação preguiçosa, você não precisa de nenhum mecanismo especial para limitar os resultados da consulta com o Realm. Por exemplo, se a sua consulta corresponder a milhares de objetos, mas você quiser carregar somente os dez primeiros, basta acessar somente os dez primeiros elementos da collection de resultados.
Paginação
Graças à avaliação preguiçosa, a tarefa comum da paginação se torna bastante simples. Por exemplo, suponha que você tenha uma coleção de resultados associada a uma consulta que corresponda a milhares de objetos em seu domínio. Você exibe cem objetos por página. Para avançar para qualquer página, basta acessar os elementos da coleta de resultados começando pelo índice que corresponde à página de destino.
Ler objetos de domínio
Consultar todos os objetos de dado específico
Para executar query de objetos de um determinado tipo em um realm, passe o tipo de objeto YourClassName
para a função de membro realm::query<T> .
Esse comando retorna um objeto Results que representa todos os objetos de um determinado tipo no domínio.
auto managedBusinesses = realm.objects<realm::Business>();
Filtrar consultas com base nas propriedades do objeto
Um filtro seleciona um subconjunto de resultados com base no(s) valor(es) de uma ou mais propriedades do objeto. O Realm oferece um mecanismo de query completo que você pode usar para definir filtros.
auto businessesNamedMongoDB = managedBusinesses.where( [](auto &business) { return business.name == "MongoDB"; });
Operadores de query suportados
Atualmente, o Realm C++ SDK suporta os seguintes operadores de query:
Igualdade (
==
,!=
)Maior que/menor que (
>
,>=
,<
,<=
)Query compostas (
||
,&&
)
Verificar o tamanho do conjunto de resultados e os resultados de acesso
O Realm Results expõe funções de nó para trabalhar com resultados. Talvez você queira verificar o tamanho de um conjunto de resultados ou acessar o objeto em um índice específico.
auto managedBusinesses = realm.objects<realm::Business>(); auto businessesNamedMongoDB = managedBusinesses.where( [](auto &business) { return business.name == "MongoDB"; }); CHECK(businessesNamedMongoDB.size() >= 1); auto mongoDB = businessesNamedMongoDB[0];
Além disso, você pode iterar os resultados ou observar um conjunto de resultados para alterações.
Ler uma propriedade de Mapa
Você pode iterar e verificar os valores de uma propriedade de mapa de Realm como faria com um mapa C++ padrão:
auto employees = realm.objects<realm::Employee>(); auto employeesNamedTommy = employees.where( [](auto &employee) { return employee.firstName == "Tommy"; }); auto tommy = employeesNamedTommy[0]; // You can get an iterator for an element matching a key using `find()` auto tuesdayIterator = tommy.locationByDay.find("Tuesday"); // You can access values for keys like any other map type auto mondayLocation = tommy.locationByDay["Monday"];
Ler uma propriedade de conjunto
Você pode iterar, verificar o tamanho de um conjunto e encontrar valores em uma propriedade definida:
auto repositories = realm.objects<realm::Repository>(); auto repositoriesNamedDocsRealm = repositories.where([](auto &repository) { return repository.ownerAndName == "mongodb/docs-realm"; }); auto docsRealm = repositoriesNamedDocsRealm[0]; // You can check the size of the set auto numberOfPullRequests = docsRealm.openPullRequestNumbers.size(); // Find an element in the set whose value is 3064 auto it = managedDocsRealm.openPullRequestNumbers.find(3064); // Get a copy of the set that exists independent of the managed set auto openRealmPullRequests = docsRealm.openPullRequestNumbers.detach();
Classificar listas e resultados da query
Uma operação de classificação permite que você configure a ordem em que o Realm retorna os objetos da lista e os resultados da query. Você pode classificar com base em uma ou mais propriedade do objeto na lista ou collection de resultados. O Realm só garante uma ordem consistente se você classificar explicitamente.
Ao contrário de std::sort, A implementação de classificação do Realm preserva o carregamento lento de objetos. Ele não extrai todo o conjunto de resultados nem lista objetos para a memória, mas apenas os carrega na memória quando você os acessa.
Para classificar, ligue para a função .sort()
em uma lista ou conjunto de resultados com um ou mais sort_descriptors.
Um sort_descriptor
inclui:
O caminho da chave desejado para classificar, como uma string.
Um bool para especificar a ordem de classificação, onde''true'' é crescente e
false
é decrescente.
Neste exemplo, classificamos um conjunto de resultados em priority
em ordem decrescente.
auto items = realm.objects<realm::Item>(); // Sort with `false` returns objects in descending order. auto itemsSorted = items.sort("priority", false);
Você também pode classificar uma lista ou um conjunto de resultados por vários descritores de classificação. Neste exemplo, classificamos uma propriedade de lista em assignee
crescente e, em ordem priority
, em ordem decrescente.
auto sortedListProperty = specificProject.items.sort({{"assignee", true}, {"priority", false}});