在使用xcode 3.2.5启动一个新的coredata项目之后我遇到了一些问题...我之前的核心数据项目(在之前的xcode中)运行正常,所以我不知道有什么区别?
所以当我构建并转到调用核心数据的视图时,我得到的错误是>
*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '*** -[NSURL initFileURLWithPath:]: nil string parameter'
奇怪的是,在我的* AppDelegate.m中,(编辑感谢Rog但仍然没有工作!)
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator_ != nil) {
return persistentStoreCoordinator_;
}
NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"staff.sqlite"];
NSURL *storeUrl = [NSURL fileURLWithPath:storePath]; //new position for the storeUrl!
// Put down default db if it doesn't already exist
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:storePath]) {
NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"staff" ofType:@"sqlite"];
if (defaultStorePath) {
[fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
}
}
中的
NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"staff.sqlite"];
我收到了警告
NSURL may not respond to '-stringByAppendingPathComponent'
我选择+单击此stringByAppendingPathComponent并获取(找不到符号!!!!)
但在其他项目中,我选择+点击相同并获得定义!!
编辑, 包含在我的viewDidLoad
中NSLog(@“path =%@”,[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject]);
给了我控制台:
path= /Users/mkss9/Library/Application Support/iPhone Simulator/4.2/Applications/2F364C20-2B87-4ABB-AA3E-FB6F7C15096F/Documents
拜托!我疯了!!
谢谢你!答案 0 :(得分:7)
某些SDK版本之前(我不知道他们什么时候确定)苹果在项目模板中更改了applicationDocumentsDirectory
的返回类型。
创建新项目时,它看起来像这样:
/**
Returns the URL to the application's Documents directory.
*/
- (NSURL *)applicationDocumentsDirectory {
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
在较旧的模板中,它看起来像这样:
/**
Returns the path to the application's documents directory.
*/
- (NSString *)applicationDocumentsDirectory {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
return basePath;
}
在这两者之间它看起来像这样:
/**
Returns the path to the application's Documents directory.
*/
- (NSString *)applicationDocumentsDirectory {
return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}
所以你必须要小心,因为所有依赖于applicationDocumentsDirectory返回NSString的旧代码都无法使用更新的模板。
您不能仅使用旧版本替换新版本,因为这会导致核心数据方法发生变化。
所以我建议你编写自己的方法来返回文档目录。 Apple经常更改applicationDocumentsDirectory
{{1}}。
答案 1 :(得分:1)
我想是因为-applicationDocumentsDirectory
会返回NSURL *
而不是NSString *
。
答案 2 :(得分:0)
首先,您需要确保applicationDocumentsDirectory
方法返回NSString。
一旦完成,后续崩溃是因为您传递的是尚不存在的路径和文件名。
因此,如果您将NSURL *storeUrl = [NSURL fileURLWithPath:storePath];
移到检查现有文件的代码之后,并将默认值放在不存在的位置,那么它应该可以解决您的问题。