4

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

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

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

4

3 回答 3

3

我正在做同样的事情,同样的问题。我的解决方案是开始一个新的可可项目,它会给你一个复选框来使用核心数据。这将生成所有核心数据堆栈访问 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]) { to if (![coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL :url 选项:nil 错误:&error]) {

于 2014-12-23T16:52:50.827 回答
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/....."   

它指向数据库位置。

于 2015-01-23T04:48:58.577 回答
-2

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

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

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

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

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

于 2014-11-11T18:27:00.453 回答