【问题标题】:Xcode 6.1 Mac OS X new project for command line toolXcode 6.1 Mac OS X 命令行工具的新项目
【发布时间】:2014-11-11 15:29:13
【问题描述】:

我正在关注这个 iOS 核心数据教程,Core Data Tutorial

我的 Xcode 版本是 6.1,而本教程使用的是旧版本。 当需要为 Mac 命令行创建新项目时,教程说“将类型更改为“Core Data””,但在我的 Xcode 中,没有这样的 Core Data 选项。

那么,我该如何启动这个“Core Data”命令行项目呢?

【问题讨论】:

    标签: core-data command-line-tool xcode6.1


    【解决方案1】:

    我正在做同样的事情,但问题完全相同。我的解决方案是开始一个新的可可项目,它会给你一个复选框来使用核心数据。这将生成所有核心数据堆栈访问 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 数据库 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版本中,他们去掉了命令行工具项目的核心数据选项。所以你必须手动将核心数据添加到命令行工具项目中
    【解决方案2】:

    我最终按照 seiterm 的建议为 Mac 创建了一个 Cocoa 应用程序。但是,创建的数据库不是 sqlite 格式。所以我为 iOS 创建了一个 Cocoa Touch 应用程序,使用相同的代码,它很好。

    此外,如果您在查找数据库位置时遇到问题,打开 SQL 调试(在其他教程之一中介绍)可能会有所帮助。这可以通过单击顶部的方案来完成,然后单击编辑方案、运行配置 -> 参数选项卡添加

     -com.apple.CoreData.SQLDebug 1 
    

    作为论据。然后当你运行应用程序时,控制台中应该会有一个输出,类似于:

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

    指向数据库位置。

    【讨论】:

      【解决方案3】:

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

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

      对我来说,这是一个好处,因为 Xcode 模板中包含的 Core Data 代码在 IMO 中并不是在您的应用程序中使用它的最佳方式。

      不过,话虽如此,您可以创建一个新的 Cocoa 应用程序,并检查是否包含核心数据。这可能足以满足您想要做的事情,即使用 Core Data。

      或者,您可以将代码复制/粘贴到命令行应用程序中,以设置和使用基本核心数据堆栈。确保你 import 核心数据模块,你应该很高兴。

      【讨论】:

        猜你喜欢
        • 2012-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-31
        • 2018-09-24
        • 2011-12-11
        • 2014-02-04
        • 2011-11-02
        相关资源
        最近更新 更多