Core Data helps you save and manage app data easily on your device. It keeps your app's information safe and organized.
Core Data overview in iOS Swift
import CoreData // Create a data model file (.xcdatamodeld) in your project // Use NSManagedObject subclasses to represent data entities // Use NSPersistentContainer to set up Core Data stack let container = NSPersistentContainer(name: "ModelName") container.loadPersistentStores { description, error in if let error = error { fatalError("Failed to load Core Data stack: \(error)") } } // Use context to save or fetch data let context = container.viewContext
Core Data uses a data model file to define your data structure visually.
NSPersistentContainer simplifies setting up Core Data in your app.
// Define an entity class class Person: NSManagedObject { @NSManaged var name: String? @NSManaged var age: Int16 }
// Save a new Person let person = Person(context: context) person.name = "Alice" person.age = 30 try? context.save()
// Fetch all Person objects let request = NSFetchRequest<Person>(entityName: "Person") let people = try? context.fetch(request)
This SwiftUI app shows a list of people saved in Core Data. You can add a new person by tapping the button. The list updates automatically.
import SwiftUI import CoreData struct ContentView: View { @Environment(\.managedObjectContext) private var viewContext @FetchRequest(entity: Person.entity(), sortDescriptors: []) private var people: FetchedResults<Person> var body: some View { VStack { List(people, id: \.objectID) { person in Text(person.name ?? "Unknown") } Button("Add Person") { let newPerson = Person(context: viewContext) newPerson.name = "New Person" newPerson.age = 30 try? viewContext.save() } } } } @main struct CoreDataApp: App { let container = NSPersistentContainer(name: "ModelName") init() { container.loadPersistentStores { _, error in if let error = error { fatalError("Core Data failed to load: \(error)") } } } var body: some Scene { WindowGroup { ContentView() .environment(\.managedObjectContext, container.viewContext) } } }
Always save the context after adding or changing data to keep it stored.
Use @FetchRequest in SwiftUI to automatically update UI when data changes.
Core Data can handle complex data and relationships, but start simple.
Core Data stores and manages app data on the device.
Use NSPersistentContainer to set up Core Data easily.
Use NSManagedObject subclasses to represent your data entities.
Practice
Solution
Step 1: Understand Core Data's role
Core Data is used to save and manage data locally on the device.Step 2: Compare with other options
UI design, network handling, and animations are handled by other frameworks, not Core Data.Final Answer:
To store and manage app data on the device -> Option BQuick Check:
Core Data = Data storage [OK]
- Confusing Core Data with UI frameworks
- Thinking Core Data manages network calls
- Assuming Core Data handles animations
Solution
Step 1: Identify Core Data setup class
NSPersistentContainer simplifies setting up Core Data stack.Step 2: Exclude unrelated classes
NSManagedObject represents data, UIViewController manages UI, URLSession handles networking.Final Answer:
NSPersistentContainer -> Option AQuick Check:
Setup Core Data = NSPersistentContainer [OK]
- Choosing NSManagedObject for setup instead of data model
- Confusing UI or network classes with Core Data setup
- Using outdated Core Data setup methods
let person = Person(context: context)
Solution
Step 1: Recognize 'Person' as NSManagedObject subclass
In Core Data, entities are represented by NSManagedObject subclasses like Person.Step 2: Exclude other types
UIViewController is for UI, struct is not used here, network object unrelated.Final Answer:
An instance of NSManagedObject subclass -> Option AQuick Check:
Core Data entity = NSManagedObject subclass [OK]
- Thinking Person is a struct or class unrelated to Core Data
- Confusing UI or network classes with data entities
- Not recognizing Core Data context usage
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Person") let results = try context.fetch(request) as? [Person] print(results.count)
Solution
Step 1: Analyze fetch request generic type
Using NSFetchRequest<NSFetchRequestResult> returns generic results; casting to [Person] may fail.Step 2: Correct approach
Use NSFetchRequest<Person> to get typed results and avoid unsafe casting.Final Answer:
Casting fetch results to [Person] may fail without specifying generic type -> Option DQuick Check:
Use typed NSFetchRequest to avoid cast issues [OK]
- Ignoring generic type in NSFetchRequest
- Assuming entity name is wrong without checking
- Thinking context.fetch is invalid usage
Solution
Step 1: Create and set attributes on Task object
Instantiate Task with context and assign the title attribute.Step 2: Save context with error handling
Call context.save() inside a do-catch block to persist changes safely.Final Answer:
Create Task object, set title, call context.save() inside do-catch -> Option CQuick Check:
Save Core Data changes with context.save() [OK]
- Forgetting to call context.save() after changes
- Using print or network calls to save data
- Ignoring error handling when saving
Ready to prove it?
Pass the test and this pattern moves unknown
