Active Record for CoreData

  • 594 views
Uploaded on

Presentation about library with name "ActiveRecord"

Presentation about library with name "ActiveRecord"

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
594
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
2
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. ActiveRecord for Core Data AZOFT
  • 2. Что такое ActiveRecord?ActiveRecord - паттерн, описанный Мартином Фаулером в книге«Patterns of Enterprise Application Architecture» (Шаблоныкорпоративных приложений). AR является популярнымспособом доступа к данным реляционных баз данных вобъектно-ориентированном программировании.Объект, выполняющий роль оболочки для строки таблицы илипредставления базы данных. Он инкапсулирует доступ к базеданных и добавляет к данным логику домена.
  • 3. ● Пусть существует таблица в базе данных. Для данной таблицы создаётся специальный класс AR, являющийся отражением (представлением) таблицы, таким образом, что:● каждый экземпляр данного класса соответствует одной записи таблицы;● при создании нового экземпляра класса (и заполнении соответствующих полей) в таблицу добавляется новая запись;● при чтении полей объекта считываются соответствующие значения записи таблицы баз данных;● при изменении (удалении) какого-либо объекта изменяется (удаляется) соответствующая ему запись.
  • 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. Как видно из примера для поиска в базе данных Сотрудников(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. ActiveRecord for Core Data позволяет:1. Сделать чище код по работе с Core Data2. Позволяет делать простые однострочныезапросы3. Несмотря на простоту, позволяетмодифицировать NSFetchRequest, когдазапрос нуждается в модификации.
  • 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. Если необходимо найти все 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. Модификация   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. Редактирование данных:Создать запись в базе данных при помощи 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. Подключение к проекту:Добавляем в MyProjectName-Prefix.pch#import "CoreData+ActiveRecordFetching.h"В AppDelegate в application:didFinishLaunchingWithOptions: добавлямвызов[ActiveRecordHelpers setupCoreDataStackWithAutoMigratingSqliteStoreNamed:@"MyProject.sqlite"];Данный метод создаст NSPersistentStore с указанным именем и файломмодели .xcdatamodeld который найдет в бандле приложения.
  • 12. Default Managed Object ContextПри работе с Core Data используется объектNSManagedObjectContext. ActiveRecord for Core Data позволяетустановить DefaultContext, который будет NSManagedObjectContext по-умолчанию для всего приложения. Создание NSManagedObjectContextдля использования в других потоках выглядит следующимобразом:NSManagedObjectContext *myNewContext = [NSManagedObjectContext newContext];Этот контекст можно сделать по-умолчанию, и тогда он будетиспользоваться во всех запросах, если в названии методазапроса вконце не стоит «inContext:». Рекомендуется создавать иустанавливать контекст по-умолчанию только в главном потоке.
  • 13. Источники● https://github.com/magicalpanda/MagicalRecord● http://ru.wikipedia.org/wiki/ActiveRecord● http://habrahabr.ru/blogs/macosxdev/130262/● «Patterns of Enterprise Application Architecture» (англ. Шаблоны корпоративных приложений)