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)