Contenido del curso
Arquitectura
Gestión de Datos en SwiftData
- 8

Uso de SWIFTDA para Persistencia de Datos en iOS 17
04:31 min - 9

Cómo grabar datos con SwiftData
10:55 min - 10

Implementación de Queries con Predicados en Swift Data
11:08 min - 11

Corrección automática y actualización de registros en SWIFTDA
06:59 min - 12

Eliminar registros y calcular totales en SwiftData
Viendo ahora
Gestión de Datos en Realm
¿Swift Data o Realm?
Eliminar registros y calcular totales en SwiftData
Resumen
Aprender a eliminar registros con SwiftData y calcular totales de ingresos y gastos te permite cerrar el ciclo CRUD en tu app iOS. Si ya implementaste lectura y modificación, este paso te deja con un servicio de base de datos funcional para proyectos de finanzas personales o cualquier app que maneje colecciones persistentes.
La lógica se apoya en predicates, descriptors y el método context.delete, todo dentro de un patrón que ya viste en operaciones previas. Lo interesante es cómo combinas estos elementos con un reduce para totalizar valores en una sola pasada.
Cómo elimino un registro en SwiftData paso a paso
La función deleteRecord reutiliza la misma estructura que usaste para modificar un registro, porque ambas operaciones necesitan localizar primero el modelo dentro de la base de datos.
El flujo es directo:
- Construyes un predicate que evalúa por el ID del registro recibido como parámetro.
- Creas un descriptor a partir de ese predicado.
- Haces
fetchpara verificar si el registro existe. - Llamas a
context.deletepasando el modelo encontrado. - Ejecutas
try context.save()para persistir el cambio.
Si el try no lanza error, retornas true asumiendo que la eliminación fue exitosa. Al probarlo en el simulador, el registro desaparece de todos los filtros porque ya no existe en la base.
¿Qué hace context.delete en SwiftData? Marca un modelo para eliminación dentro del contexto actual. La eliminación se concreta cuando llamas a
context.save(), momento en que SwiftData sincroniza los cambios con el almacenamiento persistente.
Cómo calculo totales de income y outcome con getTotals
La función getTotals devuelve una dupla con la suma de ingresos y gastos. Aquí entra en juego trabajar con dos predicados separados para filtrar por tipo de registro.
Dentro del bloque do la implementación se arma así:
- Creas un predicado que evalúa cuando el tipo del
SDRecordcoincide conincome. - Creas otro predicado idéntico pero evaluando contra
outcome. - Generas un descriptor por cada predicado:
incomeDescriptoryoutcomeDescriptor. - Haces
fetchcon cada descriptor para obtener las listas correspondientes. - Aplicas
reducesobre cada lista para sumar los valores y obtener un total. - Retornas la dupla
(income, outcome).
El reduce es la pieza clave: recorre la colección y acumula los valores en una sola variable totalizada, evitando que tengas que escribir un bucle manual.
¿Para qué sirve reduce en Swift? Es una función de orden superior que combina todos los elementos de una colección en un único valor. En este caso, lo usas para sumar los montos de cada registro filtrado por tipo.
Cómo verifico que la implementación funciona
Al correr la app en el simulador, los totales dejan de mostrar cero y reflejan los datos reales: ingresos de 18 porque existe un solo registro de ese tipo, y gastos de 22 que corresponden a la suma de dos registros de 10 más 12.
Esa coincidencia entre el cálculo manual y lo que muestra la interfaz confirma que el fetch, los predicados y el reduce están operando en conjunto sin pérdida de datos.
Por qué este patrón te sirve para cualquier servicio de base de datos
Lo valioso de esta implementación es que el patrón predicate, descriptor, fetch, acción, save se repite en lectura, modificación, eliminación y agregaciones. Cambia la acción intermedia, pero la columna vertebral es la misma.
Eso te da una base mental clara cuando migres a otra tecnología, por ejemplo Realm, donde los nombres cambian pero la intención de cada paso se mantiene.
Cuéntame en los comentarios cómo te fue con tu propia implementación de getTotals, qué dificultades encontraste y si llegaste a una versión más limpia que la mostrada aquí.