DEV Community

GoyesDev
GoyesDev

Posted on

[CoreData] Manipular los datos de una base de datos

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()
  }
}
Enter fullscreen mode Exit fullscreen mode

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)")
}
Enter fullscreen mode Exit fullscreen mode

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)")
}
Enter fullscreen mode Exit fullscreen mode

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)")
}
Enter fullscreen mode Exit fullscreen mode

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)")
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)