Основные Данные В Ios 5: Как Загружать И Импортировать Существующие Данные

Привет Хабр.

Предлагаю вам перевод статьи, с помощью которой мне стали понятны основные возможности Core Data. Примечание: Член группы по обучению iOS Адам Беркепайл любезно обновил серию Core Data в iOS 5. — Я немного расскажу об этом в этом посте.



Основные данные в iOS 5: как загружать и импортировать существующие данные

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

Предварительная загрузка/импорт существующих данных Сначала мы предварительно загружаем данные в Core Data. Есть два популярных решения этой проблемы: 1. Заполните основную дату при запуске из внешнего источника.

Приложение может заметить, что база данных еще не импортирована, и начнет считывать данные из внешнего источника (например, базы данных SQLite или XML-файла), а затем начнет вставлять данные в Core Data. 2. Предоставьте предварительно заполненную базу данных SQLite. Для этого мы позволим Core Data создать для нас структуру базы данных на основе модели, а затем наполним нашу базу данных некоторой утилитой.

Вспомогательной программой может быть наш Mac или другая программа на iPhone, которая использует Core Data для заполнения базы данных через API Core Data, или какая-либо другая программа, которая напрямую заполняет базу данных SQLite. Как только база данных заполнится, включите ее в приложении и заставьте приложение использовать ее в качестве базы данных по умолчанию, если другой базы данных еще не существует. Далее я покажу вам, как можно создать простое служебное приложение, которое создаст предварительно загруженную базу данных Core Data, которую вы сможете использовать в своем приложении.

Начинать Основное преимущество метода, который мы собираемся использовать, заключается в том, что Core Data в iOS — это те же Core Data в OS X, и они могут использовать одни и те же модели и классы.

Это означает, что мы можем написать простое консольное приложение в OS X, связать это приложение с хранилищем данных Core Data, а затем использовать его для перемещения данных из хранилища в данные нашего проекта на iOS. Разве это не чудесно?! Давайте проверим это.

Для этого мы создадим консольное приложение на Mac для предварительной загрузки наших данных.

Откройте Xcode, создайте новый проект и выберите шаблон Mac OS X\Application\Command Line Tool.

Основные данные в iOS 5: как загружать и импортировать существующие данные

Введите «CoreDataTutorial2» в качестве имени проекта, измените тип на «Базовые данные» и включите «Использовать автоматический подсчет ссылок».



Основные данные в iOS 5: как загружать и импортировать существующие данные

Завершите создание проекта, затем выберите «CoreDataTutorial2.xcdatamodeld» и удалите его.

Когда вас спросят, выберите «Переместить в корзину».



Основные данные в iOS 5: как загружать и импортировать существующие данные

Затем войдите в каталог из скачанного вами архива и найдите следующие файлы: - FailedBankCD.xcdatamodeld — FailedBankInfo.h — FailedBankInfo.m — FailedBankDetails.h — FailedBankDetails.m Скопируйте эти файлы в каталог этого проекта, а затем перетащите их в Xcode.

Основные данные в iOS 5: как загружать и импортировать существующие данные



Основные данные в iOS 5: как загружать и импортировать существующие данные

Убедитесь, что флажок «Копировать элементы в папку группы назначения (при необходимости)» установлен; если нет, то убедитесь, что вы установили флажок «CoreDataTutorial2» в «Добавить в цель».



Основные данные в iOS 5: как загружать и импортировать существующие данные

Выберите main.m. Вы заметите, что мы выбрали Core Data в качестве базового типа данных.

Теперь нам нужно внести некоторые изменения, чтобы использовать наши модели классов из проекта iOS и генерировать объекты Core Data. В ManagedObjectModel() замените метод:

  
  
  
  
  
  
  
  
  
  
  
  
   

NSString *path = [[[NSProcessInfo processInfo] arguments] objectAtIndex:0]; path = [path stringByDeletingPathExtension];

на

NSString *path = @"FailedBankCD";

Это указывает на приложение FailedBankCD.xdatamodeld, которое мы добавили вместо CoreDataTutorial2.xdatamodeld, который мы удалили в начале.

Скомпилируйте и запустите и проверьте, нет ли ошибок.

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

Чтобы удалить базу данных sqlite, выберите опцию (alt), перейдите в меню и выберите «Продукты» и «Очистить папку сборки.

».

Если вы видите такую ошибку:

NSInvalidArgumentException', reason: 'Cannot create an NSPersistentStoreCoordinator with a nil model'

Это связано с тем, что код ищет файл Momd (файл, в котором находится необходимая версия Core Data).

но если у вашей модели нет правильной версии, она будет сохранена как простая «мама».

Как объясняется в этой статье, самое быстрое решение — заменить строку в ManagedObjectModel() следующим образом:

NSURL *modelURL = [NSURL fileURLWithPath:[path stringByAppendingPathExtension:@"mom"]];

Теперь это должно скомпилироваться и работать хорошо (хотя вывода нет).

Импортировать данные В нашем примере мы будем импортировать данные из файла JSON. Ваши приложения могут импортировать данные из различных форматов, но основная идея, показанная здесь (использование приложения Mac для чтения файла и загрузки его в Core Data), по-прежнему применима.

Давайте испытаем это! Щелкните правой кнопкой мыши проект и выберите «Новый файл».

Выберите категорию «Другое» и «Пусто».



Основные данные в iOS 5: как загружать и импортировать существующие данные

Назовите файл «Banks.json» и убедитесь, что вы включили его в целевой объект «CoreDataTutorial2».



Основные данные в iOS 5: как загружать и импортировать существующие данные

В новый файл вставьте следующее:

[{ "name": "Bank1", "city": "City1", "state": "State1", "zip": 11111, "closeDate": "1/1/11" }, { "name": "Bank2", "city": "City2", "state": "State2", "zip": 22222, "closeDate": "2/2/12" }, { "name": "Bank3", "city": "City3", "state": "State3", "zip": 33333, "closeDate": "3/3/13" }, { "name": "Bank4", "city": "City4", "state": "State4", "zip": 44444, "closeDate": "4/4/14" } ]

Это строка в кодировке JSON, содержащая 4 словаря в массиве.

Каждый словарь имеет пару свойств, которые соответствуют свойствам наших объектов FailedBankInfo/FailedBankDetails. Если вы не понимаете, как работает JSON, проверьте это руководство .

Далее нам нужно указать приложению скопировать этот файл в словарь продуктов.

Выберите файл проекта, затем выберите «CoreDataTutorial2».

Выберите вкладку «Фазы сборки», Нажмите «Добавить этап сборки» и выберите «Добавить файлы копирования».

Измените место назначения на «Каталог продуктов».

Наконец, перетащите файл Banks.json в раздел «Добавить файлы».



Основные данные в iOS 5: как загружать и импортировать существующие данные

Теперь у нас есть приложение, которое запускается и инициализирует основные данные с использованием нашей модели FailedBank, а также есть классы, имеющие источник данных в виде файла Banks.json. Теперь у нас есть: - Загрузочный файл JSON - Преобразование JSON в массив Objective C. - Проход по массиву, который создает управляемый объект для каждого элемента.

— Сохранение объектов в Core Data! Давайте займемся кодированием! Откройте main.m и добавьте следующий код в функцию main (в конце блока autoreleasepool):

NSError* err = nil; NSString* dataPath = [[NSBundle mainBundle] pathForResource:@"Banks" ofType:@"json"]; NSArray* Banks = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfFile:dataPath] options:kNilOptions error:&err]; NSLog(@"Imported Banks: %@", Banks);

Итак, ваша основная функция теперь должна выглядеть так:

int main(int argc, const char * argv[]) { @autoreleasepool { // Create the managed object context NSManagedObjectContext *context = managedObjectContext(); // Custom code here. // Save the managed object context NSError *error = nil; if (![context save:&error]) { NSLog(@"Error while saving %@", ([error localizedDescription] != nil) ? [error localizedDescription] : @"Unknown Error"); exit(1); } NSError* err = nil; NSString* dataPath = [[NSBundle mainBundle] pathForResource:@"Banks" ofType:@"json"]; NSArray* Banks = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfFile:dataPath] options:kNilOptions error:&err]; NSLog(@"Imported Banks: %@", Banks); } return 0; }

Новый встроенный API NSJSONSerialization теперь используется для легкого преобразования документа JSON в базовые типы, такие как NSArray, NSDictionary и т. д. Чтобы узнать больше, прочитайте это руководство Запустим приложение:

2012-04-14 22:01:34.995 CoreDataTutorial2[18388:403] Imported Banks: ( { city = City1; closeDate = "1/1/11"; name = Bank1; state = State1; zip = 11111; }, { city = City2; closeDate = "2/2/12"; name = Bank2; state = State2; zip = 22222; }, { city = City3; closeDate = "3/3/13"; name = Bank3; state = State3; zip = 33333; }, { city = City4; closeDate = "4/4/14"; name = Bank4; state = State4; zip = 44444; } )

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

Теперь мы можем легко импортировать эти объекты в CoreData. Сначала добавьте несколько файлов в начало файла:

#import "FailedBankInfo.h" #import "FailedBankDetails.h"

Затем добавьте следующее ниже кода, который вы только что добавили ранее:

[Banks enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { FailedBankInfo *failedBankInfo = [NSEntityDescription insertNewObjectForEntityForName:@"FailedBankInfo" inManagedObjectContext:context]; failedBankInfo.name = [obj objectForKey:@"name"]; failedBankInfo.city = [obj objectForKey:@"city"]; failedBankInfo.state = [obj objectForKey:@"state"]; FailedBankDetails *failedBankDetails = [NSEntityDescription insertNewObjectForEntityForName:@"FailedBankDetails" inManagedObjectContext:context]; failedBankDetails.closeDate = [NSDate dateWithString:[obj objectForKey:@"closeDate"]]; failedBankDetails.updateDate = [NSDate date]; failedBankDetails.zip = [obj objectForKey:@"zip"]; failedBankDetails.info = failedBankInfo; failedBankInfo.details = failedBankDetails; NSError *error; if (![context save:&error]) { NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]); } }]; // Test listing all FailedBankInfos from the store NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"FailedBankInfo" inManagedObjectContext:context]; [fetchRequest setEntity:entity]; NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error]; for (FailedBankInfo *info in fetchedObjects) { NSLog(@"Name: %@", info.name); FailedBankDetails *details = info.details; NSLog(@"Zip: %@", details.zip); }

Мы используем метод enumerateObjectsUsingBlock: для перебора массива банков, ввода одного банка и сохранения контекста.

Затем мы выдаем запрос на выборку и перечисляем все банки.



2012-04-14 22:15:44.149 CoreDataTutorial2[18484:403] Name: Bank1 2012-04-14 22:15:44.150 CoreDataTutorial2[18484:403] Zip: 11111 2012-04-14 22:15:44.150 CoreDataTutorial2[18484:403] Name: Bank2 2012-04-14 22:15:44.151 CoreDataTutorial2[18484:403] Zip: 22222 2012-04-14 22:15:44.152 CoreDataTutorial2[18484:403] Name: Bank3 2012-04-14 22:15:44.152 CoreDataTutorial2[18484:403] Zip: 33333 2012-04-14 22:15:44.153 CoreDataTutorial2[18484:403] Name: Bank4 2012-04-14 22:15:44.153 CoreDataTutorial2[18484:403] Zip: 44444

Та-да! Это ваши данные основной даты.

Самое интересное то, что вы можете полностью настроить способ поступления данных.

Вместо небольшого статического файла JSON, который мы использовали, вы можете использовать несколько больших файлов / json, файл xml, экспортировать файл электронной таблицы как файл CSV. Возможности поистине безграничны.

«Доктор, вы нужны в Xcode» Сейчас мы делаем операцию на мозге.

Нам нужно взять базу данных sqlite, которую мы только что сгенерировали в консоли приложения OS X, и перенести ее в приложение iPhone. Самый простой способ найти базу данных sqlite — щелкнуть правой кнопкой мыши продукт CoreDataTutorial2 и выбрать «Показать в Finder».



Основные данные в iOS 5: как загружать и импортировать существующие данные

Откроется новое окно Finder, где был разработан проект. Здесь вы можете увидеть четыре файла: — Banks.json – json-файл с информацией о банке - CoreDataTutorial2 - Это приложение — FailedBankCD.momd (или only.mom) — это скомпилированная версия модели управляемых объектов (FailedBankCD.xdatamodeld).

— CoreDataTutorial2.sqlite – база данных sqlite, сгенерированная приложением.



Основные данные в iOS 5: как загружать и импортировать существующие данные

Этот файл «CoreDataTutorial2.sqlite» — то, что нам нужно.

Скопируйте этот файл в каталог вашего проекта из учебное пособие 1.

Основные данные в iOS 5: как загружать и импортировать существующие данные

Перетащите файл «CoreDataTutorial2.sqlite» из Finder в свой проект Xcode («Копировать элементы в папку целевой группы (если необходимо)» НЕ отмечен флажок, но «Добавить к целям» отмечен для «FailedBanksCD»).



Основные данные в iOS 5: как загружать и импортировать существующие данные



Основные данные в iOS 5: как загружать и импортировать существующие данные

Наконец откройте «FBCDAppDelegate.m».

Прокрутите вниз до метода persistStoreCoordinator. Прямо под

NSURL *storeURL = [[[[self app. line, add:



if (![[NSFileManager defaultManager] fileExistsAtPath:[storeURL path]]) { NSURL *preloadURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"CoreDataTutorial2" ofType:@"sqlite"]]; NSError* err = nil; if (![[NSFileManager defaultManager] copyItemAtURL:preloadURL toURL:storeURL error:&err]) { NSLog(@"Oops, could copy preloaded data"); } }

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

Если он не существует, то ищется путь к предварительно загруженной базе данных sqlite, который мы скачали и пытаемся скопировать базу данных в путь для обычного приложения dB. ЭТО ТАК ПРОСТО! Запустите его.

Это должно быть что-то вроде этого:

Основные данные в iOS 5: как загружать и импортировать существующие данные

Вот и все.

Спасибо всем.

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

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

Автор Статьи


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

Dima Manisha

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