Использование Activerecord Для Работы С Базовыми Данными



Введение Active Record — это шаблон проектирования для приложений, использующих базу данных для хранения информации.

Таблица базы данных отображается как класс приложения, а карта объекта класса — это строка таблицы.

Интерфейс такого объекта должен содержать такие функции, как «Вставка», «Обновление» и «Удалить», а также свойства, соответствующие столбцам таблицы.

При создании объекта в таблицу добавляется новая строка; при обновлении объекта соответствующая строка в таблице также обновляется.



Основные данные и активная запись
Core 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; NSArray *array = [moc executeFetchRequest:request error:&error]; if (array == nil) { // Deal with error. }

Как видно из примера, для поиска в базе Сотрудников, фамилия которых содержит «Уорсли» и чья зарплата превышает МРОТ, приходится писать много «лишнего» кода.

Решение этой проблемы предоставила Magical Panda в своей библиотеке.

ActiveRecord для основных данных Вот тот же пример, только с использованием ActiveRecord для основных данных:

NSNumber *minimumSalary = .

; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(lastName LIKE[c] 'Worsley') AND (salary > %@)", minimumSalary]; NSArray *employees = [Employee findAllSortedBy:@"firstName" asceding:YES withPredicate:predicate];

ActiveRecord for Core Data позволяет: 1. Сделать код для работы с Core Data Cleaner 2. Позволяет выполнять простые однострочные запросы.

3. Несмотря на свою простоту, он позволяет изменять NSFetchRequest, когда запрос требует модификации.



Использование ActiveRecord для основных данных
Настройки Загрузите библиотеку ActiveRecord for Core Data и добавьте ее в проект:

Использование ActiveRecord для работы с базовыми данными

Добавить в MyProjectName-Prefix.pch

#import "CoreData+ActiveRecordFetching.h"

в AppDelegate в приложении:didFinishLaunchingWithOptions: добавить вызов

[ActiveRecordHelpers setupCoreDataStackWithAutoMigratingSqliteStoreNamed:@"MyProject.sqlite"];

Этот метод создаст NSPersistentStore с указанным именем и файлом модели .

xcdatamodeld, который будет найден в пакете приложения.

Контекст управляемого объекта по умолчанию При работе с Core Data используется объект NSManagedObjectContext. ActiveRecord for Core Data позволяет вам установить DefaultContext, который будет NSManagedObjectContext по умолчанию для всего приложения.

Создание NSManagedObjectContext для использования другими потоками выглядит следующим образом:

NSManagedObjectContext *myNewContext = [NSManagedObjectContext newContext];

Этот контекст можно сделать по умолчанию, и тогда он будет использоваться во всех запросах, если имя метода запроса не заканчивается на «inContext:».

Рекомендуется создавать и устанавливать контекст по умолчанию только в основном потоке.

Выборка данных Допустим, есть класс Song с полями id, length и name:

@interface Song : NSManagedObject @property (nonatomic, retain) NSNumber * length; @property (nonatomic, retain) NSString * name; @property (nonatomic, retain) NSNumber * id; @end #import "Song.h" @implementation Song @dynamic length; @dynamic name; @dynamic id; @end

Библиотека ActiveRecord for Core Data содержит категорию «NSManagedObject+ActiveRecord.h», то есть все потомки NSManagedObject будут отвечать на сообщения ActiveRecord for Core Data. Большинство методов ActiveRecord for Core Data возвращают массив результатов.

Например, если вам нужно найти в базе данных все объекты Song, то вызов будет выглядеть так:

NSArray *songs = [Song findAll];

Поиск песен, отсортированных по названию, будет выглядеть так:

NSArray *songsSorted = [Song findAllSortedByProperty:@"name" ascending:YES];

Если есть песня с уникальным значением атрибута, то вы можете использовать функцию:

Song *song = [Song findFirstByAttribute:@"name" withValue:@"Imagine"];

ActiveRecord for Core Data также позволяет использовать NSPredicate: NSPredicate *songFilter = [NSPredicate predicateWithFormat:@“length > %@”, .

];

NSArray *songs = [Song findAllWithPredicate:peopleFilter];

Редактирование данных Создать запись базы данных с помощью ActiveRecord for Core Data очень просто:

Song *song = [Song createEntity];

Удаление:

[song deleteEntity];

Редактирование атрибутов:

Song *song = [Song createEntity]; song.name = "stairway to heaven"; song.length = [NSNumber numberWithInt:150];

После редактирования данных необходимо сохранить контекст:

[[NSManagedObjectContext defaultContext] save];

Теги: #active Record #objective-c #iOS #основные данные #Разработка для iOS

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.