Active Record for CoreData

829 views
718 views

Published on

Presentation about library with name "ActiveRecord"

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
829
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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» (англ. Шаблоны корпоративных приложений)

×