Статьи

iBoost Ваш код iOS, часть 2: основные данные быстро и просто!

Это вторая часть серии из нескольких частей о iBoost Framework . Ранее в iBoost Ваш код iOS, часть 1: Введение и макросы , я рассмотрел, что такое инфраструктура iBoost и основные механизмы ее макросов.

Различные фреймворки Apple поражают. Некоторые из них, такие как UIKit, имеют точный дизайн, а их согласованность делает разработку пользовательского интерфейса простой и легкой. К сожалению, Core Data, постоянная структура iOS, не настолько одарена. SDK неуклюж, его легко ошибиться, и, что хуже всего, для управления вашими данными требуется много стандартного кода.

Во всяком случае, до iBoost. :-)

CoreDataStore — это рекомендуемый проигрыватель в iBoost, когда дело доходит до упаковки инфраструктуры CoreData. Я задумал этот слой после завершения моего первого проекта на основе Core Data. Во время посмертного обзора я чувствовал отвращение ко всему низкоуровневому, трудному для понимания коду, который был результатом. Когда я пишу свой код персистентности, я ожидаю, что он будет сосредоточен на логике и структурах данных моего приложения, а не на глупости, которую я был вынужден добавить. Может быть, вы чувствуете то же самое? NSPersistentStoreCoordinators, NSManagedModels и NSManagedObjectContexts — ОХ, МОЙ!

Давайте посмотрим, как CoreDataStore все исправляет.

Инициализация и очистка основных данных

Существует только одно требование для использования Core Data и CoreDataStore в вашем проекте: включите инфраструктуру CoreData в ваш проект! Вот и все. На самом деле, я рекомендую даже не устанавливать флажок «Использовать основные данные» при настройке вашего проекта. Если вы это сделаете, вы захотите удалить все шаблоны базовых данных, которые вы найдете в вашем делегате приложения. Вам это не понадобится.

(И, кстати, Apple, вы не должны размещать этот код там … это был плохой выбор с вашей стороны. Позор. Позор!)

Готовы посмотреть, как вы инициализируете CoreDataStore?


Подожди, где код? Здесь ничего нет! Как только вы начнете использовать CoreDataStore, он автоматически создаст ваше постоянное хранилище, если оно еще не было. Я сказал вам, что это будет легко.:-)

Теперь вот бонус. Многие фреймворки не делают это доступным, но если вы когда-нибудь хотели стереть все свои данные, чтобы вы могли начать все заново, вот что вы делаете:

[[CoreDataStore mainStore] clearAllData];

 

Это очень удобно во время модульного тестирования, когда вы хотите стереть все сохраненные данные между тестами.

Вставка данных

CoreDataStore поддерживает два стиля API:

  • Стиль ActiveRecord — это предпочтительный API, который позволяет вам работать непосредственно с объектами Core Data в стиле шаблона ActiveRecord. Это требует, чтобы вы генерировали ваши объекты CoreData с их именами сущностей. Так как это уже распространено и является лучшей практикой, вы, скорее всего, будете использовать этот стиль.
  • Factory Style — этот стиль не требует генерации объектов Core Data и требует, чтобы клиентский код указывал имена сущностей как NSString. Он работает точно так же, но менее интуитивно понятен и подвержен ошибкам, поскольку не проверяется на тип.

Я покажу оба стиля. Сначала рассмотрим стиль ActiveRecord. Вы должны сгенерировать все ваши сущности Core Data как классы, будучи уверенными, что имена классов соответствуют именам сущностей. Обычно это достигается с помощью XCode, но я настоятельно рекомендую утилиту mogenerator, поскольку она использует лучший шаблон проектирования для генерации классов по два на сущность.

Вот как вы создаете новый объект:

 

Customer *apple = [Customer create];
apple.name = @"Apple";
 
[[CoreDataStore mainStore] save];

 

Здесь вы можете видеть, что мы создаем объект Customer напрямую, вызывая -create прямо на нем. Мы сохраняем в то, что называется mainStore . Это важная концепция. MainStore считается по умолчанию NSManagedObjectContext на все операции. Для большинства приложений это все, что вам нужно. По сути, он использует один дескриптор базы данных для всего вашего приложения. Одна из ситуаций, когда вы можете захотеть создать свой собственный контекст, это когда вы хотите обработать набор операций, которые вы можете откатить в определенный момент времени. Если вы хотите выполнить то же самое создание с пользовательским контекстом, код будет выглядеть так:

CoreDataStore *customStore = [CoreDataStore createStore];
 
Customer *apple = [Customer createInStore:customStore];
apple.name = @"Apple";
 
[customStore save];

Все методы CoreDataStore поддерживают этот синтаксис, что позволяет вам выбирать пользовательский CoreDataStore для выполнения ваших операций, но по умолчанию всегда используется mainStore . Вам, вероятно, понадобится только этот контекст.

Теперь, если вы не генерируете свои объекты, вы создаете данные другим способом:

 

NSManagedObject *apple = [[CoreDataStore mainStore] createNewEntityByName:@"Customer"];
apple.name = @"Apple";
 
// always remember to save!
[[CoreDataStore mainStore] save];

 

Как видите, для создания объекта вам необходимо передать имя объекта в виде строки. В остальном синтаксис аналогичен. Обратите внимание, что у вас все еще есть возможность создавать собственный контекст, а не использовать mainStore .

Удаление данных

Удаление данных одинаково в любом стиле:

 

[myObj destroy];

 

Помните, вам тоже нужно сохранить. Я больше не буду показывать этот код, но просмотрите предыдущий раздел, чтобы увидеть, как это делается.

Запрос данных

Есть много способов сделать запрос, используя CoreDataStore. Вот ряд примеров, которые должны быть просты для понимания. (Если бы это было не так, iBoost не сделал бы свою работу сейчас, не так ли?)

// all methods
NSArray *allCustomers = [Customer all];
NSArray *allCustomers = [Customer allOrderedBy:@"name" ascending:YES];
NSArray *activeCustomers = [Customer allForPredicate:[NSPredicate predicateWithFormat:@"active = 1"]];
NSArray *activeCustomers = [Customer allForPredicate:[NSPredicate predicateWithFormat:@"active = 1"] orderBy:@"name" ascending:YES];

// all methods -- custom data store
NSArray *allCustomers = [Customer allInStore:myDataStore];
NSArray *allCustomers = [Customer allOrderedBy:@"name" ascending:YES inStore:myDataStore];
NSArray *activeCustomers = [Customer allForPredicate:[NSPredicate predicateWithFormat:@"active = 1"] inStore:myDataStore];
NSArray *activeCustomers = [Customer allForPredicate:[NSPredicate predicateWithFormat:@"active = 1"] orderBy:@"name" ascending:YES inStore:myDataStore];

// first methods
UserSettings *settings = [UserSettings first];
Customer *apple = [Customer firstWithKey:@"name" value:@"Apple"];

// first methods -- custom data store
UserSettings *settings = [UserSettings firstInStore:myDataStore];
Customer *apple = [Customer firstWithKey:@"name" value:@"Apple" inStore:myDataStore];

Используйте все, что вам нужно. Там не должно быть никаких вопросов о том, что методы делают. Методы -all возвращают все данные, соответствующие запросу, если они есть. Методы -first просто возвращают первое совпадение. В большинстве ситуаций следует ожидать только одного результата. Таким образом, вы должны пытаться сопоставить одноэлементные данные (например, пользовательские настройки) или конкретное совпадение с уникальным именем.

Резюме

Цель CoreDataStore — предоставить вам доступ к базовым данным без всего того уродливого шаблона, который вам обычно необходим. Я думаю, что это хорошо, что вы думаете? В третьей части я рассмотрю Core Data Store, удобный набор методов, которые значительно упрощают использование Core Data!

В части 3 я представлю Центр сообщений, замену NSNotificationCenter, который добавляет возможность вставлять код между отправкой и получением сообщений.