Implementación de Predicados con Realm para Filtrar Registros
Clase 15 de 18 • Curso de iOS: Modo Offline con Swift Data y Realm
Resumen
¿Cómo implementar la función de búsqueda de registros con predicados en Realm?
¡Bienvenido al fascinante mundo de la programación con Realm! En esta guía, exploraremos cómo implementar una función de búsqueda en base de datos utilizando predicados en Realm. Estos predicados nos resultarán fundamentales para aplicar filtros personalizados y así obtener exactamente los registros que buscamos.
¿Qué son los predicados y cómo se utilizan?
En el contexto de bases de datos, un predicado es una expresión lógica que establece condiciones para filtrar datos. En Realm, utilizamos el tipo NSPredicate
para crear consultas personalizadas. El proceso implica definir las condiciones que deben cumplir los registros para ser recuperados.
Ejemplo de un predicado para "hoy"
Veamos un ejemplo práctico. Primero evaluamos el inicio y el fin del día para establecer un rango de fechas. Crearemos un predicado con el siguiente formato:
let predicate = NSPredicate(format: "date >= %@ AND date < %@", startDate as NSDate, endDate as NSDate)
En este fragmento, date
debe coincidir con el nombre de la propiedad en tu entidad. El predicado evalúa si la fecha es mayor o igual al inicio del día y menor al siguiente día.
¿Cómo se implementan filtros para diferentes periodos?
Los predicados pueden ser adaptados para diferentes filtros de tiempo, como esta semana, este mes o el último año. A continuación te mostramos cómo puedes manejar cada caso:
-
Semana actual
Calcula el inicio y el fin de la semana. Luego, utiliza los predicados de la misma forma que hicimos para el día:
let startOfWeek = Calendar.current.startOfWeek(for: Date()) let endOfWeek = Calendar.current.endOfWeek(for: Date()) let weekPredicate = NSPredicate(format: "date >= %@ AND date < %@", startOfWeek as NSDate, endOfWeek as NSDate)
-
Mes actual
Similar al ejemplo anterior, calcula los límites del mes actual para tu predicado.
-
Año actual
Finalmente, para calcular un año, obtén el inicio del año hasta la fecha actual.
¿Cómo se obtienen los registros filtrados?
Con los predicados establecidos, podemos recuperar los registros. Aquí te mostramos cómo crear una variable results
que obtenga los objetos filtrados:
let results = realm.objects(RMRecord.self).filter(predicate)
Luego, estos resultados pueden transformarse en un arreglo para su procesamiento:
let recordsArray = results.toArray().map { $0.toRecord() }
Corramos la aplicación: Eligiendo servicios de base de datos
Antes de probar nuestra aplicación, asegúrate de configurar correctamente el servicio de base de datos. Cambia tu servicio a Realm Database Service
para que el simulador utilice la nueva configuración.
// Comentar la base de datos anterior
// self.databaseService = SwiftDataService()
// Implementar la base de datos de Realm
self.databaseService = RealmDatabaseService()
Probando los filtros en la aplicación
Finalmente, acude al simulador y prueba agregar y filtrar registros. Verás que tus predicados funcionan como un reloj suizo, asegurando que los registros que buscas sean los correctos.
Con estos pasos, tienes una implementación completa y funcional de filtros de búsqueda personalizados en Realm. Experimenta, ajusta y crea aplicaciones aún más dinámicas. En las próximas clases, exploraremos cómo actualizar y eliminar registros, ¡así que no te pierdas el próximo capítulo de esta emocionante serie!