Here are some commonly asked Core Data interview questions, categorized for different levels of expertise.
Basic Questions
- What is Core Data in iOS?
- Core Data is Appleās framework for managing an object graph and persisting data in an iOS/macOS app. It helps in storing, retrieving, and managing structured data efficiently.
- What are the main components of Core Data?
- NSManagedObjectContext: Manages object lifecycle and changes.
- NSPersistentContainer: Manages the Core Data stack (since iOS 10).
- NSManagedObjectModel: Defines data structure (entities, attributes, relationships).
- NSPersistentStoreCoordinator: Handles communication between context and persistent store.
- NSManagedObject: Represents a single record in Core Data.
- How is Core Data different from SQLite?
- Core Data is an object graph management framework, while SQLite is a database.
- Core Data provides features like caching, relationships, and undo/redo, whereas SQLite requires manual queries.
- How do you add Core Data to a new/existing iOS project?
- Select “Use Core Data” when creating a new project.
- For existing projects:
- Add
CoreData.framework. - Create a
.xcdatamodeldfile. - Set up
NSPersistentContainerinAppDelegateorSceneDelegate.
- Add
Intermediate Questions
- How do you perform CRUD operations in Core Data?
- Create:
let entity = User(context: context) entity.name = "Mike" try? context.save() - Read:
let fetchRequest: NSFetchRequest<User> = User.fetchRequest() let users = try? context.fetch(fetchRequest) - Update:
user.name = "Michael" try? context.save() - Delete:
context.delete(user) try? context.save()
- Create:
- What is
NSFetchedResultsController?- A controller that efficiently fetches and monitors changes in data, typically used with
UITableVieworUICollectionViewfor automatic updates.
- A controller that efficiently fetches and monitors changes in data, typically used with
- How do you perform batch updates in Core Data?
let batchUpdateRequest = NSBatchUpdateRequest(entityName: "User") batchUpdateRequest.propertiesToUpdate = ["name": "Updated Name"] batchUpdateRequest.resultType = .updatedObjectsCountResultType let result = try? context.execute(batchUpdateRequest) as? NSBatchUpdateResult - What is an
NSPersistentContainer?- Introduced in iOS 10, it simplifies Core Data stack management.
let container = NSPersistentContainer(name: "MyApp") container.loadPersistentStores { _, error in if let error = error { fatalError("Failed to load: \(error)") } }
Advanced Questions
- What is the difference between
privateQueueConcurrencyTypeandmainQueueConcurrencyType?mainQueueConcurrencyType: Used for UI-related tasks.privateQueueConcurrencyType: Used for background operations.
- How to handle Core Data concurrency?
- Use background contexts with
performorperformAndWait:
backgroundContext.perform { let newUser = User(context: backgroundContext) newUser.name = "Async User" try? backgroundContext.save() } - Use background contexts with
- What is Core Data Migration?
- When a data model changes (e.g., adding a new attribute), Core Data migrations ensure smooth transitions without data loss.
- How do you handle Core Data multi-threading issues?
- Use multiple contexts: One for the main thread, one for background tasks.
- Never pass managed objects between threads; instead, pass object IDs:
let objectID = user.objectID backgroundContext.perform { let backgroundUser = backgroundContext.object(with: objectID) backgroundUser.name = "Updated in Background" try? backgroundContext.save() }
Scenario-Based Questions
- How would you optimize Core Data performance?
- Use
NSBatchInsertRequestfor bulk inserts. - Use
NSPersistentContainerfor background operations. - Fetch only required attributes (
fetchRequest.propertiesToFetch). - Use indexing in the data model.
- Avoid retaining
NSManagedObjectinstances for too long.
- Use
- How do you debug Core Data issues?
- Enable SQL debugging:
UserDefaults.standard.set(true, forKey: "com.apple.CoreData.SQLDebug") - Use
Faultingto fetch only necessary data. - Check logs for errors in
NSPersistentStoreCoordinator.
- Enable SQL debugging:
- What happens if two different contexts modify the same object?
- Core Data resolves conflicts using merge policies:
context.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
- Core Data resolves conflicts using merge policies: