infinum ios talks s01e02 - things every ios developer should know about core data by filip beć

21
CORE DATA

Upload: denisinfinum

Post on 12-May-2015

402 views

Category:

Technology


1 download

DESCRIPTION

Learn about persistent store coordinator, managed object model, object contexts and other wonderful things in the Core Data iOS framework.

TRANSCRIPT

Page 1: Infinum iOS Talks S01E02 - Things every iOS developer should know about Core Data by Filip Beć

CORE DATA

Page 2: Infinum iOS Talks S01E02 - Things every iOS developer should know about Core Data by Filip Beć

WHAT IS CORE DATA?

• data persistence framework

• not a database

Page 3: Infinum iOS Talks S01E02 - Things every iOS developer should know about Core Data by Filip Beć

CORE DATA COMPONENTS

Managed object context

User application

Managed object

Persistent store coordinator

Persistent store(SQLite, XML,

in memory, custom, …)

Managed object

Managed object

Managed object model

Page 4: Infinum iOS Talks S01E02 - Things every iOS developer should know about Core Data by Filip Beć

PERSISTENT STORE• NSPersistentStore

• Types:

• SQLite

• Binary

• In memory

• Custom

Page 5: Infinum iOS Talks S01E02 - Things every iOS developer should know about Core Data by Filip Beć

PERSISTENT STORE COORDINATOR

• NSPersistentStoreCoordinator

• associates persistent object stores and a managed object model

• facade to managed object contexts

• group of persistent stores appears as a single aggregate store

Page 6: Infinum iOS Talks S01E02 - Things every iOS developer should know about Core Data by Filip Beć

PERSISTENT STORE COORDINATOR

• Complex application

MOC MOC MOC

Persistent store coordinator

Storage1 Storage2 Storage3 Storage4

Page 7: Infinum iOS Talks S01E02 - Things every iOS developer should know about Core Data by Filip Beć

MANAGED OBJECT MODEL (MOM)

• A collection of entity descriptions

• name of the class, properties (attributes and relationships)

Page 8: Infinum iOS Talks S01E02 - Things every iOS developer should know about Core Data by Filip Beć

MANAGED OBJECT CONTEXT (MOC)

• NSManagedObjectContext

• environment where managed objects live

• responsibility to manage a collection of managed objects • validation

• faulting

• (inverse) relationship handling

• undo/redo

!

• should be always accessible

Page 9: Infinum iOS Talks S01E02 - Things every iOS developer should know about Core Data by Filip Beć

MANAGED OBJECT

• NSManagedObject • model object

• represents a record from persistent store

Managed object - PersondateOfBirth 07.03.1990. firstName IvanlastName Horvat

Entity description

Page 10: Infinum iOS Talks S01E02 - Things every iOS developer should know about Core Data by Filip Beć

CORE DATA PROJECT

• INITIALISATION • persistent store coordinator • managed object model • managed object context

• HOW? • use Xcode template

Page 11: Infinum iOS Talks S01E02 - Things every iOS developer should know about Core Data by Filip Beć

CORE DATA PROJECT

• New project - Master-Detail Application

Page 12: Infinum iOS Talks S01E02 - Things every iOS developer should know about Core Data by Filip Beć

INSERTING OBJECTNSManagedObjectContext *context = … !CDLocation *location = [NSEntityDescription insertNewObjectForEntityForName:@“CDLocation” inManagedObjectContext:context]; !. . . !NSError *error = nil; if (![context save:&error]) {

// Replace this implementation with code to handle the error appropriately. NSLog(@“Error: %@“, error); }

Page 13: Infinum iOS Talks S01E02 - Things every iOS developer should know about Core Data by Filip Beć

CONTEXT HIERARCHY

MOC MOC MOC

Persistent store coordinator

MOC MOC MOC

MOC MOC• child - parent

Page 14: Infinum iOS Talks S01E02 - Things every iOS developer should know about Core Data by Filip Beć

TEMPORARY OBJECTS

• child context:

NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; context.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy; ! context.parentContext = self.managedObjectContext; // self.managedObjectContext is main context NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity]; NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context]; . . .

Page 15: Infinum iOS Talks S01E02 - Things every iOS developer should know about Core Data by Filip Beć

TEMPORARY OBJECTS

• [context save:&error] will save object to main context (parent context)

• object is still not saved to persistent store

• remove object from main context: undo or rollback

• save object in persistent store: save main context

Page 16: Infinum iOS Talks S01E02 - Things every iOS developer should know about Core Data by Filip Beć

UNDO/REDO/ROLLBACK

• NSUndoManager [context setUndoManager:undoManager]; ! [context undo]; ! [context redo];

• undo all unsaved changes [context rollback];

Page 17: Infinum iOS Talks S01E02 - Things every iOS developer should know about Core Data by Filip Beć

FETCHING OBJECTS

NSFetchRequest *request = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@“CDLocation" inManagedObjectContext:context]; ! [request setEntity:entity]; NSArray *locations = [context executeFetchRequest:request error:nil];

• NSFetchRequest

Page 18: Infinum iOS Talks S01E02 - Things every iOS developer should know about Core Data by Filip Beć

SORT RESULTS

• NSSortDescriptor

NSFetchRequest *request = [[NSFetchRequest alloc] init]; … … … NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey: @"dateOfBirth" ascending:NO]; [request setSortDescriptors:@[sortDescriptor]]; !NSArray *results = [context executeFetchRequest:request error:nil];

Page 19: Infinum iOS Talks S01E02 - Things every iOS developer should know about Core Data by Filip Beć

FILTER RESULTS

• NSPredicate

NSFetchRequest *request = [[NSFetchRequest alloc] init]; … … … NSPredicate *predicate = [NSPredicate predicateWithFormat:@"firstName contains %@", @"Ivana"]; [request setPredicate:predicate]; !NSArray *results = [context executeFetchRequest:request error:nil];

Page 20: Infinum iOS Talks S01E02 - Things every iOS developer should know about Core Data by Filip Beć

SEE ALSO

• NSFetchedResultController

• NSIncrementalStore

• Custom storage types

• Migrating data and versioning

Page 21: Infinum iOS Talks S01E02 - Things every iOS developer should know about Core Data by Filip Beć

LITERATURE

• Apple documentation Core Data programming Guide: https://developer.apple.com/library/mac/documentation/cocoa/Conceptual/CoreData/cdProgrammingGuide.htmlCore Data Core Competencies: https://developer.apple.com/library/ios/documentation/DataManagement/Devpedia-CoreData/coreDataOverview.html

• Pro Core Data for iOS - second edition Michael Privat, Robert Warner