我正在关注此iOS核心数据教程Core Data Tutorial
我的Xcode版本是6.1,而教程使用较旧版本。 当需要为Mac命令行创建一个新项目时,教程说“将类型更改为”核心数据“”,但在我的Xcode中,没有这样的核心数据选项。
那么,我该如何启动这个“核心数据”命令行项目?
答案 0 :(得分:3)
我做同样的事情,完全相同的问题。我的解决方案是启动一个新的可可项目,它将为您提供一个使用Core Data的复选框。这将生成所有Core Data Stack访问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]){
答案 1 :(得分: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/....."
指向数据库位置。
答案 2 :(得分:-2)
首先,您正在使用iOS教程开发Mac OS X应用程序。核心数据的使用在两者之间非常相似,但在您的应用程序中使用它的方式有一些明显不同(即,您通常对mac应用程序使用NSArrayController
,而对于iOS应用程序使用NSFetchedResultsController
)。
命令行应用程序的模板没有Core Data复选框。
对我而言,这是一个好处,因为Xcode模板中包含的核心数据代码是IMO,而不是在您的应用程序中使用它的最佳方式。
然而,话虽如此,您可以创建一个新的Cocoa应用程序,并检查以包含Core Data。这对于你想要做的事情来说已经足够了,这就是使用Core Data。
或者,您可以将代码复制/粘贴到命令行应用程序中,以设置和使用基本核心数据堆栈。确保你import
核心数据模块,你应该好好去。