Swift Core Data

Persistent data storage framework for iOS apps

💾 What is Core Data?

Core Data is Apple's framework for managing object graphs and persisting data in iOS apps. It provides automatic data validation, relationship management, and efficient memory handling for complex data models.


// Basic Core Data setup
import CoreData

let context = persistentContainer.viewContext
let entity = NSEntityDescription.entity(forEntityName: "Person", in: context)!
let person = NSManagedObject(entity: entity, insertInto: context)
                                    

Core Data Components

🏗️

Data Model

Define entities and relationships

// .xcdatamodeld file
// Entity: Person
// Attributes: name (String), age (Int16)
📦

Managed Objects

Objects that represent data

class Person: NSManagedObject {
    @NSManaged var name: String
    @NSManaged var age: Int16
}
🔄

Context

Manages object lifecycle

let context = container.viewContext
try context.save()
🔍

Fetch Requests

Query and retrieve data

let request: NSFetchRequest
request = Person.fetchRequest()

🔹 Setting Up Core Data Stack

Basic Core Data stack setup in your app:

import CoreData

class CoreDataStack {
    lazy var persistentContainer: NSPersistentContainer = {
        let container = NSPersistentContainer(name: "DataModel")
        container.loadPersistentStores { _, error in
            if let error = error {
                fatalError("Core Data error: \(error)")
            }
        }
        return container
    }()
    
    var context: NSManagedObjectContext {
        return persistentContainer.viewContext
    }
    
    func save() {
        if context.hasChanges {
            try? context.save()
        }
    }
}

🔹 Creating and Saving Data

Add new objects to Core Data:

// Create new person
let context = coreDataStack.context
let person = Person(context: context)
person.name = "John Doe"
person.age = 25

// Save to persistent store
do {
    try context.save()
    print("Person saved successfully!")
} catch {
    print("Failed to save: \(error)")
}

🔹 Fetching Data

Retrieve data with fetch requests:

// Fetch all persons
let request: NSFetchRequest = Person.fetchRequest()

// Add sorting
request.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]

// Add filtering
request.predicate = NSPredicate(format: "age > %d", 18)

// Execute fetch
do {
    let people = try context.fetch(request)
    for person in people {
        print("\(person.name) is \(person.age) years old")
    }
} catch {
    print("Fetch failed: \(error)")
}

🔹 Updating and Deleting

Modify existing Core Data objects:

// Update
person.age = 26
try? context.save()

// Delete
context.delete(person)
try? context.save()

// Batch delete
let deleteRequest = NSBatchDeleteRequest(fetchRequest: Person.fetchRequest())
try? context.execute(deleteRequest)

🧠 Test Your Knowledge

What is the main class for managing Core Data objects?