Xcode 6.1 Mac OS X新建命令行工具项目

4
我正在学习这篇iOS core data的教程:Core Data 教程
我使用的Xcode版本是6.1,而该教程使用了较旧的版本。 在需要为Mac命令行创建一个新项目时,教程中提到“将类型更改为“Core Data””,但是在我的Xcode中,并没有这样的Core Data选项。
那么,我该如何开始这个“Core Data”命令行项目呢?
3个回答

3
我正在做与此类似的事情,遇到了同样的问题。我的解决方案是开始一个新的Cocoa项目,并使用核心数据复选框。这将生成所有核心数据堆栈访问��节。从那里开始实现相当直接,除了所有工作都在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数据库,请将以下代码片段更改为: if (![coordinator addPersistentStoreWithType:NSXMLStoreType configuration:nil URL:url options:nil error:&error]) { 修改为: if (![coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&error]) {


在最新的Xcode版本中,他们已经移除了命令行工具项目的核心数据选项。因此,您必须手动将核心数据添加到命令行工具项目中。 - Ashwin G

2
我最终创建了一款Mac的Cocoa应用程序,就像seiterm建议的那样。然而,所创建的数据库并不是sqlite格式的。因此,我创建了一款iOS的Cocoa Touch应用程序,使用相同的代码,它很好地工作了。
此外,如果您在寻找数据库位置时遇到困难,可以打开SQL调试(在其他教程中介绍)。这可以通过点击顶部的scheme,然后编辑方案,选择“运行配置- >参数”选项卡,并添加来完成。
 -com.apple.CoreData.SQLDebug 1 

作为参数传递。然后当你运行应用程序时,控制台上应该有一个输出,类似于:
CoreData: annotation: Connecting to sqlite database file at "/Users/doraemon/Library/....."   

指向数据库位置的地方。


-2

首先,您正在使用iOS教程开发Mac OS X应用程序。两者之间的核心数据使用非常相似,但是在应用程序中使用它的方式有一些明显的区别(即,您通常在Mac应用程序中使用NSArrayController,而在iOS应用程序中使用NSFetchedResultsController)。

命令行应用程序的模板没有Core Data复选框。

对我来说,这是一个好处,因为Xcode模板附带的Core Data代码,在我的看法中并不是在应用程序中使用它的最佳方法。

然而,话虽如此,您可以创建一个新的Cocoa应用程序,并选择包括Core Data。这可能已经足够满足您想要做的事情,即玩弄Core Data。

或者,您可以将代码复制/粘贴到命令行应用程序中以设置和使用基本的核心数据堆栈。确保您import Core Data模块,您就可以开始了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接