Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
ActiveRecord for Core Data          AZOFT
Что такое ActiveRecord?ActiveRecord - паттерн, описанный Мартином Фаулером в книге«Patterns of Enterprise Application Arch...
●   Пусть существует таблица в базе данных. Для данной    таблицы создаётся специальный класс AR, являющийся    отражением...
Core Data и Active RecordCore Data основана на паттерне Active Record, но для работы сбазой данных приходится писать довол...
Как видно из примера для поиска в базе данных  Сотрудников(Employee) у которых фамилия содержит  «Worsley» и зарплата выше...
ActiveRecord for Core Data позволяет:1. Сделать чище код по работе с Core Data2. Позволяет делать простые однострочныезапр...
Примеры использования. Допустим есть класс Song с полями id, length и name:@interface Song : NSManagedObject@property (non...
Если необходимо найти все Song объекты в базе данных, товызов будет иметь следующий вид:NSArray *songs = [Song MR_findAll]...
Модификация   NSFetchRequest:  NSPredicate *peopleFilter = [NSPredicate predicateWithFormat: @"Department IN%@", departmen...
Редактирование данных:Создать запись в базе данных при помощи ActiveRecord forCore Data очень просто:Song *song = [Song MR...
Подключение к проекту:Добавляем в MyProjectName-Prefix.pch#import "CoreData+ActiveRecordFetching.h"В AppDelegate в applica...
Default Managed Object ContextПри работе с Core Data используется объектNSManagedObjectContext. ActiveRecord for Core Data...
Источники●   https://github.com/magicalpanda/MagicalRecord●   http://ru.wikipedia.org/wiki/ActiveRecord●   http://habrahab...
Upcoming SlideShare
Loading in …5
×

Active Record for CoreData

934 views

Published on

Presentation about library with name "ActiveRecord"

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Active Record for CoreData

  1. 1. ActiveRecord for Core Data AZOFT
  2. 2. Что такое ActiveRecord?ActiveRecord - паттерн, описанный Мартином Фаулером в книге«Patterns of Enterprise Application Architecture» (Шаблоныкорпоративных приложений). AR является популярнымспособом доступа к данным реляционных баз данных вобъектно-ориентированном программировании.Объект, выполняющий роль оболочки для строки таблицы илипредставления базы данных. Он инкапсулирует доступ к базеданных и добавляет к данным логику домена.
  3. 3. ● Пусть существует таблица в базе данных. Для данной таблицы создаётся специальный класс AR, являющийся отражением (представлением) таблицы, таким образом, что:● каждый экземпляр данного класса соответствует одной записи таблицы;● при создании нового экземпляра класса (и заполнении соответствующих полей) в таблицу добавляется новая запись;● при чтении полей объекта считываются соответствующие значения записи таблицы баз данных;● при изменении (удалении) какого-либо объекта изменяется (удаляется) соответствующая ему запись.
  4. 4. Core Data и Active RecordCore Data основана на паттерне Active Record, но для работы сбазой данных приходится писать довольно громоздкий код.Пример Apple: NSManagedObjectContext *moc = [self managedObjectContext]; NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Employee" inManagedObjectContext:moc]; NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; [request setEntity:entityDescription]; // Set example predicate and sort orderings... NSNumber *minimumSalary = ...; NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(lastName LIKE[c] Worsley) AND (salary > %@)", minimumSalary]; [request setPredicate:predicate]; NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES]; [request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]]; [sortDescriptor release]; NSError *error = nil; NSArray *array = [moc executeFetchRequest:request error:&error]; if (array == nil){ // Deal with error... }
  5. 5. Как видно из примера для поиска в базе данных Сотрудников(Employee) у которых фамилия содержит «Worsley» и зарплата выше минимальной зарплаты приходится писать много «лишнего» кода. Решение данной проблемы предоставили Magical Panda в своей библиотеке ActiveRecord for Core Data Вот тот же пример, только с использованием ActiveRecord for CoreData(MagicalRecord):NSNumber *minimumSalary = ...;NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(lastName LIKE[c] Worsley) AND (salary > %@)", minimumSalary];NSArray *employees = [Employee MR_findAllSortedBy:@"firstName" asceding:YES withPredicate:predicate];
  6. 6. ActiveRecord for Core Data позволяет:1. Сделать чище код по работе с Core Data2. Позволяет делать простые однострочныезапросы3. Несмотря на простоту, позволяетмодифицировать NSFetchRequest, когдазапрос нуждается в модификации.
  7. 7. Примеры использования. Допустим есть класс Song с полями id, length и name:@interface Song : NSManagedObject@property (nonatomic, retain) NSNumber * length;@property (nonatomic, retain) NSString * name;@property (nonatomic, retain) NSNumber * unid;@end@implementation Song@dynamic length;@dynamic name;@dynamic unid;@end
  8. 8. Если необходимо найти все Song объекты в базе данных, товызов будет иметь следующий вид:NSArray *songs = [Song MR_findAll];Поиск песен, отсортированных по name будет иметь вид:NSArray *songs = [Song MR_findAllSortedBy:@"name" ascending:YES];Если есть песня с уникальным значением атрибута, томожно воспользоваться функцией:NSArray *songs = [Song MR_findFirstByAttribute:@"name" withValue:@"Imagine"];Так же ActiveRecord for Core Data позволяет использоватьNSPredicate:NSPredicate *songFilter = [NSPredicate predicateWithFormat:@"length > %@", @""];NSArray *songs = [Song MR_findAllWithPredicate:songFilter];
  9. 9. Модификация   NSFetchRequest: NSPredicate *peopleFilter = [NSPredicate predicateWithFormat: @"Department IN%@", departments]; NSFetchRequest *peopleRequest = [Place requestAllWithPredicate:peopleFilter]; [peopleRequest setReturnsDistinctResults:NO]; [peopleRequest setReturnPropertiesNamed:[NSArray arrayWithObjects:@"FirstName", @"LastName", nil]]; ... NSArray *people = [Place executeFetchRequest:peopleRequest];Количество вхождений: NSNumber *count = [Place MR_numberOfEntities]; NSNumber *count = [Place MR_numberOfEntitiesWithPredicate: ...];Агрегатные операции: NSPredicate *prediate = [NSPredicate predicateWithFormat: ...]; int totalFat = [[Place aggregateOperation:@"sum:" onAttribute:@"fatColories"withPredicate:predicate] intValue]; int fattest = [[Place aggregateOperation:@"max:" onAttribute:@"fatColories"withPredicate:predicate] intValue];
  10. 10. Редактирование данных:Создать запись в базе данных при помощи ActiveRecord forCore Data очень просто:Song *song = [Song MR_createEntity];Занимает очень мало кода в отличии от этого примера:Song *song = (Song *)[NSEntityDescription insertNewObjectForEntityForName:@"Song" insertNewObjectForEntityForName:[ self managedObjectContext]];Удаление:[song MR_deleteEntity]; [Song truncateAll];Редактирование аттрибутов:Song *song = [Song MR_createEntity];song.name = @"stairway to heaven";song.length = [NSNumber numberWithInt:150];После редактирования данных необходимо сохранить контекст:[[NSManagedObjectContext defaultContext] MR_save];
  11. 11. Подключение к проекту:Добавляем в MyProjectName-Prefix.pch#import "CoreData+ActiveRecordFetching.h"В AppDelegate в application:didFinishLaunchingWithOptions: добавлямвызов[ActiveRecordHelpers setupCoreDataStackWithAutoMigratingSqliteStoreNamed:@"MyProject.sqlite"];Данный метод создаст NSPersistentStore с указанным именем и файломмодели .xcdatamodeld который найдет в бандле приложения.
  12. 12. Default Managed Object ContextПри работе с Core Data используется объектNSManagedObjectContext. ActiveRecord for Core Data позволяетустановить DefaultContext, который будет NSManagedObjectContext по-умолчанию для всего приложения. Создание NSManagedObjectContextдля использования в других потоках выглядит следующимобразом:NSManagedObjectContext *myNewContext = [NSManagedObjectContext newContext];Этот контекст можно сделать по-умолчанию, и тогда он будетиспользоваться во всех запросах, если в названии методазапроса вконце не стоит «inContext:». Рекомендуется создавать иустанавливать контекст по-умолчанию только в главном потоке.
  13. 13. Источники● https://github.com/magicalpanda/MagicalRecord● http://ru.wikipedia.org/wiki/ActiveRecord● http://habrahabr.ru/blogs/macosxdev/130262/● «Patterns of Enterprise Application Architecture» (англ. Шаблоны корпоративных приложений)

×