Добавление основных данных в существующий проект в XCode 4
Я начал проект без Core Data, и теперь я хотел бы добавить эту функциональность в свои приложения. Как мне это сделать?
Какие дополнительные функции XCode настраивается, когда вы на самом деле устанавливаете флажок Использовать основные данные при создании нового проекта?
Ответы
Ответ 1
Один трюк - просто создать новый пустой проект с поддержкой Core Data. Это даст вам необходимый код, который вы можете скопировать в свой оригинальный проект и скомпилировать.
Единственное, что вам нужно, это обработать файл заголовка Core Data. Xcode помещает его в предварительно скомпилированные файлы заголовков при создании файлов с использованием шаблонов. Таким образом, вы можете добавить следующую строку в ваш .pch файл:
#import <CoreData/CoreData.h>
или вы можете просто добавить его в файлы .m, если необходимо.
Это работает как шарм. Обратите внимание на комментарий Luka ниже о том, как это сделать в Xcode5.
Ответ 2
Просто изложите все шаги, которые вам действительно нужно выполнить, чтобы добавить Core Data в проект, который ранее не имел его:
Шаг 1: добавьте фреймворк
Нажмите на целевую страницу приложения (на левой панели ее верхний значок с именем вашего приложения), затем перейдите на вкладку "Сборка фаз", затем в "Связывание двоичных файлов с библиотеками", щелкните маленькую цифру "+" на затем найдите "CoreData.framework" и добавьте его в свой проект
Затем либо импортируйте coredata на все объекты, в которых вы нуждаетесь (без сексапильного способа), используя:
#import <CoreData/CoreData.h>
или добавьте импорт под общим импортом в ваш .pch файл (гораздо более сексуальный), например:
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
#endif
Шаг 2: добавьте модель данных
Чтобы добавить файл .xcdatamodel, щелкните правой кнопкой мыши/щелкните правой кнопкой мыши на ваших файлах в правой панели (например, в папке "Ресурсы" для безопасного хранения) и выберите "Добавить новый файл". Перейдите на вкладку "Основные данные" при выборе типа файла затем нажмите "Модель данных", дайте ему имя и нажмите "Далее" и "Готово", и он добавит его в ваш проект. Когда вы нажмете на этот объект модели, вы увидите, что интерфейс добавит объекты в ваш проект с любыми отношениями, которые вы хотите.
Шаг 3: Обновить делегат приложения
Добавьте эти объекты в AppDelegate.h
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
- (NSURL *)applicationDocumentsDirectory; // nice to have to reference files for core data
Синтезировать предыдущие объекты в AppDelegate.m следующим образом:
@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
Затем добавьте эти методы в AppDelegate.m(не забудьте указать имя модели, которую вы добавили в показанных точках):
- (void)saveContext{
NSError *error = nil;
NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
if (managedObjectContext != nil) {
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
}
- (NSManagedObjectContext *)managedObjectContext{
if (_managedObjectContext != nil) {
return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
_managedObjectContext = [[NSManagedObjectContext alloc] init];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return _managedObjectContext;
}
- (NSManagedObjectModel *)managedObjectModel{
if (_managedObjectModel != nil) {
return _managedObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"NAMEOFYOURMODELHERE" withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return _managedObjectModel;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"NAMEOFYOURMODELHERE.sqlite"];
NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return _persistentStoreCoordinator;
}
#pragma mark - Application Documents directory
// Returns the URL to the application Documents directory.
- (NSURL *)applicationDocumentsDirectory{
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
Шаг 4: Получить объекты данных в ViewControllers, где вам нужны данные
в ViewController.h
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
В ViewController.m
@synthesize managedObjectContext = _managedObjectContext;
В AppDelegate или классе, где создан ViewController, установите для managedObjectContext тот же самый, что и AppDelegate
ViewController.managedObjectContext = self.managedObjectContext;
Если вы хотите, чтобы viewcontroller с использованием Core Data был FetchedResultsController, вам нужно убедиться, что этот материал находится в вашем ViewController.h
@interface ViewController : UIViewController <NSFetchedResultsControllerDelegate> {
NSFetchedResultsController *fetchedResultsController;
NSManagedObjectContext *managedObjectContext;
}
@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
И это в ViewController.m
@synthesize fetchedResultsController, managedObjectContext;
После всего этого вы можете теперь использовать этот управляемый объектObjectContext для запуска всех обычных fetchRequests, необходимых для обеспечения CoreData! Наслаждайтесь
Ответ 3
Если вы хотите добавить CoreData.framework в свой проект, дважды щелкните значок "Целевое" в списке "Группы и файлы". Перейдите в панель "Сводка" и нажмите "+" для связанных библиотек. Выберите CoreData.framework. Затем он свяжется с вашим проектом.
Ответ 4
Xcode добавляет набор элементов в стандартный шаблон для Core Data.
Если вы не знакомы с этим, создайте новый проект Core Data и вставьте в него свои собственные вещи, а не пытайтесь добавить инфраструктуру в существующий проект.
В принципе, вы получаете...
- Пустая модель Core Data.
- Код инициализации для стека основных данных
Ответ 5
Очень просто добавить Core Data в свой проект, сравнив его с новым проектом, в т.ч. Основные данные. Вам нужно добавить файл "Модель данных" и некоторые методы и ivars в AppDelegate.
Посмотрите шаблон шаблона основных данных в файле реализации → "Core Data stack".
Ответ 6
Я нашел самый простой способ - создать новый проект с основными данными, удалить файлы в проекте и перетащить из непрофильного проекта данных в основной проект данных. (Main.storyboard, AppDelegate, ViewController и т.д.)