Introducció a Core Data

Core Data és un framework d'Apple que permet gestionar el model de dades d'una aplicació. És una eina poderosa per emmagatzemar dades de manera persistent, gestionar objectes i relacionar-los entre si. En aquest tema, aprendrem a configurar Core Data en un projecte de Swift, crear models de dades, realitzar operacions CRUD (Crear, Llegir, Actualitzar, Eliminar) i optimitzar el rendiment.

Objectius

  • Entendre què és Core Data i per què és útil.
  • Configurar Core Data en un projecte de Swift.
  • Crear models de dades.
  • Realitzar operacions CRUD.
  • Optimitzar el rendiment de Core Data.

Configuració de Core Data

Pas 1: Crear un nou projecte amb Core Data

  1. Obre Xcode i crea un nou projecte.
  2. Selecciona "App" i fes clic a "Next".
  3. Omple els camps necessaris (nom del projecte, organització, etc.).
  4. Assegura't de marcar la casella "Use Core Data".
  5. Fes clic a "Next" i després a "Create".

Pas 2: Entendre els fitxers generats

Quan crees un projecte amb Core Data, Xcode genera alguns fitxers addicionals:

  • Model de dades (.xcdatamodeld): Aquí és on definiràs els teus models de dades.
  • Persistent Container: Gestiona el context de dades i la coordinació de la persistència.

Crear Models de Dades

Pas 1: Obrir el model de dades

  1. A la navegació del projecte, busca el fitxer .xcdatamodeld i fes-hi clic.
  2. Això obrirà l'editor de models de dades.

Pas 2: Afegir entitats

  1. Fes clic al botó "+" a la part inferior de l'editor de models de dades per afegir una nova entitat.
  2. Dona un nom a la teva entitat (per exemple, Person).

Pas 3: Afegir atributs

  1. Selecciona l'entitat que acabes de crear.
  2. Fes clic al botó "+" a la secció "Attributes" per afegir un nou atribut.
  3. Dona un nom i un tipus al teu atribut (per exemple, name de tipus String).

Exemple de Model de Dades

Entity: Person
Attributes:
- name: String
- age: Integer16

Operacions CRUD

Crear

Per crear un nou objecte i guardar-lo a la base de dades:

import CoreData
import UIKit

class ViewController: UIViewController {
    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Crear un nou objecte
        let newPerson = Person(context: context)
        newPerson.name = "John Doe"
        newPerson.age = 30
        
        // Guardar l'objecte
        do {
            try context.save()
        } catch {
            print("Error al guardar: \(error)")
        }
    }
}

Llegir

Per llegir objectes de la base de dades:

func fetchPeople() {
    let request: NSFetchRequest<Person> = Person.fetchRequest()
    
    do {
        let people = try context.fetch(request)
        for person in people {
            print("Nom: \(person.name), Edat: \(person.age)")
        }
    } catch {
        print("Error al llegir: \(error)")
    }
}

Actualitzar

Per actualitzar un objecte existent:

func updatePerson(person: Person) {
    person.name = "Jane Doe"
    
    do {
        try context.save()
    } catch {
        print("Error al actualitzar: \(error)")
    }
}

Eliminar

Per eliminar un objecte de la base de dades:

func deletePerson(person: Person) {
    context.delete(person)
    
    do {
        try context.save()
    } catch {
        print("Error al eliminar: \(error)")
    }
}

Optimització del Rendiment

Utilitzar NSBatchUpdateRequest

Per actualitzar múltiples registres de manera eficient:

let batchUpdateRequest = NSBatchUpdateRequest(entityName: "Person")
batchUpdateRequest.propertiesToUpdate = ["age": 35]
batchUpdateRequest.resultType = .updatedObjectsCountResultType

do {
    let batchUpdateResult = try context.execute(batchUpdateRequest) as? NSBatchUpdateResult
    print("Nombre de registres actualitzats: \(batchUpdateResult?.result ?? 0)")
} catch {
    print("Error al actualitzar en batch: \(error)")
}

Utilitzar NSBatchDeleteRequest

Per eliminar múltiples registres de manera eficient:

let fetchRequest: NSFetchRequest<NSFetchRequestResult> = Person.fetchRequest()
let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)

do {
    try context.execute(batchDeleteRequest)
} catch {
    print("Error al eliminar en batch: \(error)")
}

Exercicis Pràctics

Exercici 1: Crear i Guardar Objectes

  1. Crea una nova entitat anomenada Car amb els atributs make (String) i year (Integer16).
  2. Escriu el codi per crear i guardar un nou objecte Car.

Exercici 2: Llegir i Mostrar Objectes

  1. Escriu el codi per llegir tots els objectes Car de la base de dades i mostrar-los en la consola.

Exercici 3: Actualitzar Objectes

  1. Escriu el codi per actualitzar l'atribut year d'un objecte Car existent.

Exercici 4: Eliminar Objectes

  1. Escriu el codi per eliminar un objecte Car de la base de dades.

Solucions

Solució Exercici 1

let newCar = Car(context: context)
newCar.make = "Toyota"
newCar.year = 2020

do {
    try context.save()
} catch {
    print("Error al guardar: \(error)")
}

Solució Exercici 2

let request: NSFetchRequest<Car> = Car.fetchRequest()

do {
    let cars = try context.fetch(request)
    for car in cars {
        print("Marca: \(car.make), Any: \(car.year)")
    }
} catch {
    print("Error al llegir: \(error)")
}

Solució Exercici 3

func updateCar(car: Car) {
    car.year = 2021
    
    do {
        try context.save()
    } catch {
        print("Error al actualitzar: \(error)")
    }
}

Solució Exercici 4

func deleteCar(car: Car) {
    context.delete(car)
    
    do {
        try context.save()
    } catch {
        print("Error al eliminar: \(error)")
    }
}

Conclusió

En aquesta secció, hem après a configurar Core Data en un projecte de Swift, crear models de dades, i realitzar operacions CRUD. També hem vist com optimitzar el rendiment de Core Data utilitzant operacions en batch. Amb aquests coneixements, estàs preparat per gestionar dades de manera eficient en les teves aplicacions iOS.

© Copyright 2024. Tots els drets reservats