Добавление базовых данных в существующий проект в XCode 4 - PullRequest
26 голосов
/ 26 июля 2011

Я начал проект без Core Data, и теперь я хотел бы добавить эту функциональность в мои приложения. Как мне это сделать?

Какие дополнительные функции настраивает XCode, когда вы фактически ставите галочку Использовать базовые данные при создании нового проекта?

Ответы [ 6 ]

42 голосов
/ 26 июля 2011

Один трюк - просто создать новый пустой проект с поддержкой Core Data.Это даст вам необходимый код, который вы сможете скопировать в исходный проект и скомпилировать.

Единственное, что нужно, это то, что вам нужно обработать заголовочный файл Core Data.Xcode помещает его в предварительно скомпилированные заголовочные файлы, когда генерирует файлы с использованием шаблонов.Таким образом, вы можете добавить следующую строку в ваш файл .pch:

#import <CoreData/CoreData.h>

или вы можете просто добавить его в файлы .m, где это необходимо.

Это работает как шарм.Обратите внимание на комментарий Луки ниже о том, как это сделать в Xcode5.

19 голосов
/ 21 апреля 2014

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

Шаг 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, щелкните правой кнопкой мыши / удерживайте нажатой клавишу «Control» на своих файлах на правой панели (как в папке «Ресурсы» для безопасного хранения) и выберите «Добавить новый файл». Выберите вкладку «Основные данные» при выборе типа файла затем нажмите «Модель данных», дайте ему имя, нажмите «Далее» и «Готово», и он добавит его в ваш проект. Когда вы нажмете на этот объект Model, вы увидите интерфейс для добавления сущностей в ваш проект с любыми связями, которые вы хотите.

Шаг 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's Documents directory

// Returns the URL to the application's 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 one

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;

После всего этого вы теперь можете использовать этот managedObjectContext для запуска всех обычных запросов fetch, необходимых для совершенства CoreData! Наслаждайтесь

2 голосов
/ 01 февраля 2013

Если вы хотите добавить CoreData.framework в свой проект, дважды щелкните по Target в списке групп и файлов.Перейдите на панель «Сводка» и нажмите «+» для связанных библиотек.Выберите CoreData.framework.Затем он свяжется с вашим проектом.

1 голос
/ 26 июля 2011

XCode добавляет набор вещей в стандартный шаблон для Core Data.

Если вы не знакомы с ним, то создайте новый проект Core Data и вставьте в него свой собственный материал, а не пытайтесь добавить инфраструктуру в существующий проект.

В основном вы получаете ...

  • Пустая модель базовых данных.
  • Код инициализации для стека базовых данных
0 голосов
/ 09 января 2015

Я обнаружил, что самым простым способом было создание нового проекта с основными данными, удаление файлов в проекте и перетаскивание из проекта неосновных данных в основной проект данных.(Main.storyboard, AppDelegate, ViewController и т. Д.)

0 голосов
/ 26 июля 2011

Действительно просто добавить Core Data в ваш проект, сравнив его с новым проектом, в т.ч. Основные данные. Вам нужно добавить файл «Модель данных» и некоторые методы и ivars в AppDelegate.

Посмотрите на шаблон проекта базовых данных в файле реализации -> «Базовый стек данных».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...