我正在关注这个 iOS 核心数据教程,核心数据教程
我的 Xcode 版本是 6.1,而本教程使用的是旧版本。当需要为 Mac 命令行创建新项目时,教程说“将类型更改为“Core Data””,但在我的 Xcode 中,没有这样的 Core Data 选项。
那么,我该如何启动这个“Core Data”命令行项目呢?
我正在关注这个 iOS 核心数据教程,核心数据教程
我的 Xcode 版本是 6.1,而本教程使用的是旧版本。当需要为 Mac 命令行创建新项目时,教程说“将类型更改为“Core Data””,但在我的 Xcode 中,没有这样的 Core Data 选项。
那么,我该如何启动这个“Core Data”命令行项目呢?
我正在做同样的事情,同样的问题。我的解决方案是开始一个新的可可项目,它会给你一个复选框来使用核心数据。这将生成所有核心数据堆栈访问 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]) {
我最终按照 seiterm 的建议为 Mac 创建了一个 Cocoa 应用程序。但是,创建的数据库不是 sqlite 格式。所以我为 iOS 创建了一个 Cocoa Touch 应用程序,使用相同的代码,它很好。
此外,如果您在查找数据库位置时遇到问题,打开 SQL 调试(在其他教程之一中介绍)可能会有所帮助。这可以通过单击顶部的方案来完成,然后单击编辑方案、运行配置 -> 参数选项卡并添加
-com.apple.CoreData.SQLDebug 1
作为论据。然后,当您运行应用程序时,控制台中应该有一个输出,例如:
CoreData: annotation: Connecting to sqlite database file at "/Users/doraemon/Library/....."
它指向数据库位置。
首先,您正在使用 iOS 教程来开发 Mac OS X 应用程序。两者之间的核心数据使用非常相似,但是在应用程序中使用它的方式存在一些明显差异(即,您通常NSArrayController
用于 mac 应用程序,而您NSFetchedResultsController
用于 iOS 应用程序)。
命令行应用程序的模板没有 Core Data 复选框。
对我来说,这是一个好处,因为 Xcode 模板中包含的 Core Data 代码在 IMO 中并不是在您的应用程序中使用它的最佳方式。
但是,话虽如此,您可以创建一个新的 Cocoa 应用程序,并检查是否包含核心数据。这可能足以满足您想要做的事情,即使用 Core Data。
或者,您可以将代码复制/粘贴到命令行应用程序中,以设置和使用基本核心数据堆栈。确保你import
是核心数据模块,你应该很高兴。