Xcode 6.1 Mac OS X новый проект для инструмента командной строки


Я следую этому учебнику iOS core data, Core Data Tutorial

Моя версия Xcode-6.1, в то время как учебник использует более старую версию. Когда требуется создать новый проект для командной строки Mac, в учебнике говорится: "измените тип на "Core Data"", но в моем Xcode такой опции Core Data нет.

Итак, как мне запустить этот проект командной строки "основные данные"?

3 4

3 ответа:

Я делаю почти то же самое, с той же самой проблемой. Мое решение состояло в том, чтобы начать новый проект cocoa, который даст вам флажок для использования основных данных. Это приведет к созданию всех основных gubbins доступа к стеку данных. Реализация довольно прямолинейна оттуда, за исключением того, что вся работа выполняется в AppDelegate.m. функция main() заменена функцией applicationDidFinishLaunching: ().. метод.

Требуются только следующие изменения:

(NSManagedObjectModel *)managedObjectModel {
    // The managed object model for the application. It is a fatal error for the application not to be able to find and load its model.
    if (_managedObjectModel) {
        return _managedObjectModel;
    }

    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"FailedBankCD" withExtension:@"momd"];
    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    return _managedObjectModel;
}

И

(void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    // Insert code here to initialize your application
    NSManagedObjectContext *context = self.managedObjectContext;

    NSError *error = nil;
    if (![context save:&error]) {
        NSLog(@"darn... %@", 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);

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    dateFormatter.dateFormat = @"mm/dd/yy";

    [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"]]; //deprecated in yosemite
        failedBankDetails.closeDate = [dateFormatter dateFromString:[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(@"darn... %@", [error localizedDescription]);
        }
    }];

    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);
    }
}

Лучший из удача...

Правка 1: Чтобы получить базу данных SQLite, которую учебник продолжает изменять если (![addPersistentStoreWithType координатор:конфигурация NSXMLStoreType:отсутствует URL-адрес:URL-адрес параметры:ошибка Нил:&об ошибке]) { к если (![координатор addPersistentStoreWithType:конфигурация NSSQLiteStoreType:отсутствует URL-адрес:URL-адрес параметры:ошибка Нил:&об ошибке]) {

В итоге я создал приложение Cocoa для Mac, как и предлагал seiterm. Однако созданная база данных не была в формате sqlite. Поэтому я создал приложение Cocoa Touch для iOS, использовал тот же код, и это было прекрасно.

Кроме того, если у вас возникли проблемы с поиском расположения базы данных, может быть полезно включить отладку SQL (описанную в одном из других учебных пособий). Это можно сделать, щелкнув схему вверху, затем изменить схему, запустить вкладку config - > Arguments и добавление

 -com.apple.CoreData.SQLDebug 1 

В качестве аргумента. Затем, когда вы запускаете приложение, в консоли должен быть вывод, что-то вроде:

CoreData: annotation: Connecting to sqlite database file at "/Users/doraemon/Library/....."   

, который указывает на расположение базы данных.

Во-первых, вы используете учебник iOS для разработки приложения Mac OS X. Использование основных данных очень похоже между ними, но есть некоторые очевидные различия в том, как вы используете их в своем приложении (а именно, вы обычно используете NSArrayController для приложений mac, в то время как вы используете NSFetchedResultsController для приложений iOS).

Шаблон для приложения командной строки не имеет флажка основные данные.

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

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

Или, вы можете просто скопировать / вставить код в приложение командной строки, чтобы настроить и использовать базовый стек данных ядра. Убедитесь, что вы import Основной модуль данных, и вы должны быть хорошо идти.