Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Magical Record

Magical Record

Fábio Nogueira de Almeida

January 21, 2016
Tweet

More Decks by Fábio Nogueira de Almeida

Other Decks in Technology

Transcript

  1. MagicalRecord is easy to use, well developed and popular. As

    described by the project’s author, the point of MagicalRecord is to “clean up” Core Data code and enable simple one-line fetches of data. -- RayWenderlich
  2. If you think Core Data is hard, think again! MagicalRecord

    makes setting up and using Core Data fast and easy! And free! -- MagicalRecord
  3. MagicalRecord was inspired by the ease of Ruby on Rails'

    Active Record fetching. The goals of this code are: 4 Clean up my Core Data related code 4 Allow for clear, simple, one-line fetches 4 Still allow the modification of the NSFetchRequest when request optimizations are needed
  4. Realm é um substituto para o SQLite e Core Data

    Magical Record é um facilitador para o Core Data
  5. // In the AppDelegate.h @property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;

    @property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel; @property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator; - (void)saveContext; - (NSURL *)applicationDocumentsDirectory; // In the AppDelegate.m - (void)applicationWillTerminate:(UIApplication *)application { // Saves changes in the application's managed object context before the application terminates. [self saveContext]; } - (void)saveContext { NSError *error = nil; NSManagedObjectContext *managedObjectContext = self.managedObjectContext; if (managedObjectContext != nil) { if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) { NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } } }
  6. #pragma mark - Core Data stack - (NSManagedObjectContext *)managedObjectContext {

    if (__managedObjectContext != nil) { return __managedObjectContext; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if (coordinator != nil) { __managedObjectContext = [[NSManagedObjectContext alloc] init]; [__managedObjectContext setPersistentStoreCoordinator:coordinator]; } return __managedObjectContext; } - (NSManagedObjectModel *)managedObjectModel { if (__managedObjectModel != nil) { return __managedObjectModel; } NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"blaba" withExtension:@"momd"]; __managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; return __managedObjectModel; } - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if (__persistentStoreCoordinator != nil) { return __persistentStoreCoordinator; } NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"blaba.sqlite"]; NSError *error = nil; __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } return __persistentStoreCoordinator; }
  7. #pragma mark - Application's Documents directory /** Returns the URL

    to the application's Documents directory. */ - (NSURL *)applicationDocumentsDirectory { return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; }
  8. Criando Entidades 4 Magical Record Person *myPerson = [Person MR_createEntity];

    4 Core Data NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; Person *myPerson = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context;
  9. Salvando Entidades 4 Magical Record [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) { Person

    *myPerson = [Person MR_createEntity]; person.name = detailViewController.textView.text; }]; 4 Core Data NSManagedObjectContext *context = [fetchedResultsController managedObjectContext]; NSEntityDescription *entity = [[fetchedResultsController fetchRequest] entity]; NSManagedObject *person = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context]; [person setValue:detailViewController.textView.text forKey:@"name"]; NSError *error; if (![context save:&error]) { abort(); }
  10. Deletando entidades 4 Magical Record [person MR_deleteEntity]; 4 Core Data

    NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; NSError *error; [context deleteObject:person]; if (![context save:&error]) { abort(); }
  11. Consultando entidades 4 Core Data NSManagedObjectContext *moc = [self managedObjectContext];

    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Employee" inManagedObjectContext:moc]; NSFetchRequest *request = [[NSFetchRequest alloc] init]; [request setEntity:entityDescription]; NSNumber *minimumSalary = ...; NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(lastName LIKE[c] 'Worsley') AND (salary > %@)", minimumSalary]; [request setPredicate:predicate]; NSError *error; NSArray *array = [moc executeFetchRequest:request error:&error]; if (array == nil) { }
  12. Consultando entidades 4 Magical Record NSPredicate *employeeFilter = NSPredicate *predicate

    = [NSPredicate predicateWithFormat: @"(lastName LIKE[c] 'Worsley') AND (salary > %@)", minimumSalary]; NSArray *people = [Person MR_findAllWithPredicate:employeeFilter];
  13. Operações de agregação NSNumber *totalCalories = [CTFoodDiaryEntry MR_aggregateOperation:@"sum:" onAttribute:@"calories" withPredicate:predicate];

    NSNumber *mostCalories = [CTFoodDiaryEntry MR_aggregateOperation:@"max:" onAttribute:@"calories" withPredicate:predicate]; NSArray *caloriesByMonth = [CTFoodDiaryEntry MR_aggregateOperation:@"sum:" onAttribute:@"calories" withPredicate:predicate groupBy:@"month"];