Подтвердить что ты не робот

Добавление основных данных в существующий проект в XCode 4

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

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

4b9b3361

Ответ 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 и т.д.)