Docs Menu
Docs Home
/ /
CRUD - SDK de C++

CRUD - Lectura - SDK de C++

Puede volver a leer los datos que ha almacenado en Realm buscando, filtrando y ordenando objetos.

Una lectura de un reino generalmente consta de los siguientes pasos:

  • Obtener todos los objetos de un determinado tipo del reino.

  • Opcionalmente, puedes filtrar los resultados.

Las operaciones de consulta devuelven una colección de resultados. Estas colecciones están activas, lo que significa que siempre contienen los resultados más recientes de la consulta asociada.

Diseñe los patrones de acceso a datos de su aplicación en torno a estas tres características de lectura clave para leer los datos de la manera más eficiente posible.

Los resultados de una consulta no son copias de sus datos. Modificar los resultados de una consulta modifica directamente los datos en el disco. Esta asignación de memoria también significa que los resultados están en tiempo real: es decir, siempre reflejan el estado actual del disco.

Realm solo ejecuta una consulta cuando se solicitan los resultados. Esta evaluación diferida permite escribir código de alto rendimiento para gestionar grandes conjuntos de datos y consultas complejas. Se pueden encadenar varias operaciones de filtrado sin necesidad de procesar el estado intermedio.

Una ventaja del modelo de objetos de Realm es que conserva automáticamente todas las relaciones de un objeto como referencias directas. Esto permite recorrer el gráfico de relaciones directamente a través de los resultados de una consulta.

Una referencia directa, o puntero, te permite acceder directamente a las propiedades de un objeto relacionado a través de la referencia.

Otras bases de datos suelen copiar objetos del almacenamiento de la base de datos a la memoria de la aplicación cuando necesitas trabajar directamente con ellos. Debido a que los objetos de la aplicación contienen referencias directas, tienes la siguiente opción: copiar el objeto al que se hace referencia en cada referencia directa fuera de la base de datos en caso de que sea necesario, o simplemente copiar la clave externa de cada objeto y hacer query para el objeto con esa clave si se accede a él. Si eliges copiar objetos referenciados a la memoria de la aplicación, puedes usar muchos recursos para objetos a los que nunca se accede, pero si elige solo copiar la clave externa, las búsquedas de objetos referenciados pueden causar que su aplicación se vuelva lenta.

Realm evita todo esto mediante objetos activos de copia cero. Los accesos a objetos de Realm apuntan directamente al almacenamiento de la base de datos mediante mapeo de memoria, por lo que no hay distinción entre los objetos en Realm y los resultados de la consulta en la memoria de la aplicación. Gracias a esto, se pueden recorrer referencias directas en todo un reino desde cualquier resultado de consulta.

Gracias a la evaluación diferida, no se necesita ningún mecanismo especial para limitar los resultados de las consultas con Realm. Por ejemplo, si la consulta coincide con miles de objetos, pero solo se desea cargar los diez primeros, simplemente se accede únicamente a los diez primeros elementos de la colección de resultados.

Gracias a la evaluación diferida, la tarea habitual de paginación se simplifica considerablemente. Por ejemplo, supongamos que tiene una colección de resultados asociada a una consulta que coincide con miles de objetos en su dominio. Muestra cien objetos por página. Para avanzar a cualquier página, simplemente acceda a los elementos de la colección de resultados comenzando por el índice correspondiente a la página de destino.

Para consultar objetos de un tipo determinado en un reino, pase el tipo de objeto YourClassName a la función miembrorealm::query.<T>

Esto devuelve un objeto Results que representa todos los objetos del tipo dado en el reino.

auto managedBusinesses = realm.objects<realm::Business>();

Un filtro selecciona un subconjunto de resultados según el valor de una o más propiedades del objeto. Realm proporciona un motor de consulta completo que permite definir filtros.

auto businessesNamedMongoDB = managedBusinesses.where(
[](auto &business) { return business.name == "MongoDB"; });

Actualmente, el C++ SDK de Realm es compatible con los siguientes operadores del query:

  • Igualdad (==, !=)

  • Mayor que/menor que (>, >=, <, <=)

  • Consultas compuestas (||, &&)

Resultados de Realm expone funciones miembro para trabajar con resultados. Puede que desee comprobar el tamaño de un conjunto de resultados o acceder al objeto en un í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];

Además, puede iterar a través de los resultados u observar un conjunto de resultados para detectar cambios.

Puede iterar y verificar los valores de una propiedad de mapa de reino como lo haría con un mapa C++ estándar:

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"];

Puede iterar, verificar el tamaño de un conjunto y encontrar valores en una propiedad del conjunto:

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();

Una operación de ordenación permite configurar el orden en que Realm devuelve los objetos de lista y los resultados de consulta. Puede ordenar según una o más propiedades de los objetos de la lista o la colección de resultados. Realm solo garantiza un orden consistente si ordena explícitamente.

A diferencia de usar std::sort, la implementación de sort de Realm conserva la carga diferida de objetos. No extrae todo el conjunto de resultados ni los objetos de lista a memoria, sino que solo los carga cuando se accede a ellos.

Para ordenar, llame a la .sort() función en una lista o conjunto de resultados con uno o más sort_descriptors.

Un sort_descriptor incluye:

  • La ruta de clave deseada para ordenar, como una cadena.

  • Un valor booleano para especificar el orden de clasificación, donde "verdadero" es ascendente y false es descendente.

En este ejemplo, ordenamos un conjunto de resultados en priority en orden descendente.

auto items = realm.objects<realm::Item>();
// Sort with `false` returns objects in descending order.
auto itemsSorted = items.sort("priority", false);

También puede ordenar una lista o un conjunto de resultados mediante varios descriptores de ordenación. En este ejemplo, ordenamos una propiedad de lista según assignee en orden ascendente y luego según priority en orden descendente.

auto sortedListProperty =
specificProject.items.sort({{"assignee", true}, {"priority", false}});

Volver

Crear