Accediendo base de datos SQLite de Core Data

Libranner Santos
06 marzo, 20243min de lectura
Cuando trabajamos con Core Data, por defecto, Xcode utiliza SQLite para persistir los datos en disco. Core Data proporciona las herramientas necesarias para gestionar los datos en la base de datos. Sin embargo, en ocasiones, es necesario visualizar la base de datos directamente para comprender cómo se almacenan los datos o validar que el grafo de entidades se crea en SQLite según nuestras necesidades.
Método uno: Imprimir logs de Core Data en la consola
Para imprimir registros detallados de Core Data, debemos agregar el argumento com.apple.CoreData.SQLDebug
al iniciar la aplicación.
Para hacerlo, incluimos el siguiente texto en el esquema de nuestra aplicación: -com.apple.CoreData.SQLDebug 3
, como se muestra en la siguiente imagen:

Para ver los detalles de un esquema, selecciónalo en la barra superior de Xcode y presiona "Editar Esquema" ó "Edit Scheme".
En este caso, hemos pasado el valor 3
; sin embargo, también podemos usar 0
, 1
o 2
. Cuanto mayor sea el valor, más detalles se mostrarán en la consola.
Al principio de los registros generados, encontraremos un texto similar a este:
CoreData: annotation: Connecting to sqlite database file at ".../CoreSimulator/Devices/D2BA215A-77F6-4BEB-88D9-E0198F5B9413/data/Containers/Data/Application/A4818E31-8BB6-468D-BC3E-1E28A9E4E01F/Library/Application Support/EasyReminder.sqlite"
Método dos: Utilizando StoreDescription
Para emplear este método, necesitamos agregar una línea de código que imprima en consola la URL donde se encuentra la base de datos SQLite. Busquemos el código que configura el Core Data Stack; una opción es buscar la siguiente línea de código:
container.loadPersistentStores(completionHandler: { (storeDescription, error) in...
Esta línea se encarga de cargar el destino de almacenamiento (o destinos), en nuestro caso, una base de datos SQLite. El código que debemos agregar se vería así:
container.loadPersistentStores(completionHandler: { (storeDescription, error) indebugPrint(storeDescription.url)...
Este debugPrint
imprimirá en consola el contenido de la propiedad url
de storeDescription
, que es donde se encuentra nuestra base de datos.
Esta es solo una de las formas de acceder a un storeDescription
. Lo importante es saber que contiene una propiedad url
que podemos usar para saber dónde está la base de datos.
Interactuando con SQLite
Si accedemos a la ruta utilizando la terminal, encontraremos algo como esto:

Es posible que veas archivos adicionales, uno terminado en "sqlite-shm" que se utiliza para mejorar el rendimiento mediante el uso de memoria compartida, y otro terminado en "sqlite-wal" utilizado por SQLite para mejorar la consistencia y durabilidad transaccional mediante logs.
Si usas macOS, deberías tener instalado SQLite. Puedes utilizar los siguientes comandos en la terminal para obtener más información:
Ejecuta sqlite3 NombreBaseDeDatos.sqlite
para acceder a la base de datos.
Notarás que Core Data agrega una "Z" delante de los nombres de las entidades que creamos para evitar conflictos.
Luego de acceder a la base de datos:
- Para listar las tablas de la base de datos, escribe
.tables
y presiona enter. - Para obtener información sobre el esquema de una tabla en específico, usa
.schema NombreDeLaTabla
. - Puedes utilizar los típicos comando SQL, como
select
,insert into
ydelete
.

Si necesitas acceder a una base de datos de SwiftData puedes utilizar estos mismos pasos, solo que la base de datos termina en .store en vez de .sqlite.