Inicializando el Stack de Core Data
En el directorio raíz del proyecto (en nuestro caso DatabasePoC), cree la clase CoreDataManager y agregue la siguiente implementación:
import CoreData
class CoreDataManager {
static let instance = CoreDataManager()
private let container: NSPersistentContainer
private init() {
// Construir la instancia con el nombre de nuestro modelo de datos
container = NSPersistentContainer(name: "CompanyModel")
// Se inicia el contenedor.
container.loadPersistentStores { description, error in
if let error {
print("Error loading stores: \(error.localizedDescription)")
}
}
}
// Se requiere un contexto para manipular las instancias
func getViewContext() -> NSManagedObjectContext {
container.viewContext
}
func getBackgroundContext() -> NSManagedObjectContext {
container.newBackgroundContext()
}
}
Aquí creamos una instancia de NSPersistentContainer con el nombre del modelo de datos y damos acceso a un contexto para manipular a la base de datos. Por otro lado, por medio del patrón singleton podemos tener una referencia a esta instancia.
Agregar elementos a la base de datos
Crear una instancia del NSManagedObject (e.g. DBEmployee) y asignar valores para sus atributos y relaciones (opcional). Luego pedir al contexto que se guarde.
let department = DBDepartment(context: context)
department.name = "Recursos Humanos"
let employee = DBEmployee(context: context)
employee.name = "Juan Pérez"
employee.age = 30
employee.position = "Ingeniero"
// CoreData actualiza la inversa automáticamente
employee.department = department
do {
try context.save()
} catch {
print("Error al guardar empleado: \(error)")
}
Eliminar elementos de la base de datos
Obtener la instancia del NSManagedObject (e.g. DBEmployee), pedir al contexto que la elimine y luego pedirle que se guarde.
let request: NSFetchRequest<DBEmployee> = DBEmployee.fetchRequest()
request.predicate = NSPredicate(format: "name == %@", "Juan Pérez")
do {
if let employee = try context.fetch(request).first {
context.delete(employee)
try context.save()
}
} catch {
print("Error: \(error)")
}
Listar elementos de la base de datos
Obtener todas las instancia del NSManagedObject (e.g. DBEmployee), por medio del NSManagedObject y luego pedirle al contexto que extraiga todas las entradas.
let request: NSFetchRequest<DBEmployee> = DBEmployee.fetchRequest()
request.predicate = NSPredicate(format: "name == %@", "Juan")
request.sortDescriptors = [NSSortDescriptor(key: "age", ascending: true)]
do {
let employees = try context.fetch(request)
} catch {
print("Error: \(error)")
}
Puedo aplicar filtros con NSPredicate y aplicar varios criterios de ordenamiento simultáneamente con NSSortDescriptor . Si no se aplica ningún descriptor de orden, no habrá orden definido. Con esto quiero decir que NO SE DEBE ASUMIR ORDEN por fecha de creación.
Actualizar elementos de la base de datos
Obtener la instancia del NSManagedObject (e.g. DBEmployee), cambiar sus atributos y luego pedirle al contexto que se guarde.
let request: NSFetchRequest<DBEmployee> = DBEmployee.fetchRequest()
request.predicate = NSPredicate(format: "name == %@", "Juan Pérez")
do {
if let employee = try context.fetch(request).first {
employee.name = "John Doe"
try context.save()
}
} catch {
print("Error: \(error)")
}
Top comments (0)