为什么Core Data在iOS 4上没有正确设置?

时间:2012-04-29 11:21:40

标签: iphone core-data ios4

我正在开发一个使用Core Data的应用。在iOS 5中,我没有任何问题。

然而,在iOS 4中,当我尝试保存任何信息时,我收到一条错误消息(更准确地说:Cocoa错误134030,以及“没有这样的文件或目录”)。当我查看文档文件夹时,SQL文件不存在。我已经调试了这个,这些方法都没有导致错误或nil指针。

最奇怪的部分:方法addPersistentStoreWithType不会返回任何错误,但同时也不会创建sqlite文件。

在一行中,我的应用程序没有在documents文件夹中创建sql文件。同样,这只发生在iOS 4中。

为什么我的应用不会在iOS 4上创建sqlite文件?

//Core Data stack

- (NSManagedObjectContext *)managedObjectContext
{

NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil)
{
    __managedObjectContext = [[NSManagedObjectContext alloc] init];
    [__managedObjectContext setPersistentStoreCoordinator:coordinator];
}

return __managedObjectContext;
}

- (NSManagedObjectModel *)managedObjectModel
{
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Practi" withExtension:@"momd"];
__managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

if (__managedObjectModel == nil)
{
    NSLog(@"NSManagedObjectModel in AppDelegate == nil");
}

return __managedObjectModel;
}

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"MyAppDataBase.sqlite"];
NSError *error = nil;
__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
{

    NSLog(@"APPDELEGATE Unresolved error %@, %@", error, [error userInfo]);
}

return __persistentStoreCoordinator;
}

- (NSURL *)applicationDocumentsDirectory
{
NSString *docsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
return [NSURL fileURLWithPath:docsDirectory];
}

2 个答案:

答案 0 :(得分:0)

有时,您应该为您的文件使用扩展名mom,有时候momd。第一个是文件,第二个是引用目录。

我看到嵌入式资源有时我需要使用mom扩展文件才能正确加载文件(在框架资源的情况下没有目录)。也许可能就是这样。

答案 1 :(得分:0)

我发现了解决问题的方法:

当调用上面描述的每个方法时,我再次创建对象,而不是检查它是否已经存在以返回。因此,正如代码现在一样,它也适用于iOS 4。