2012-03-18 104 views
0

我正在使用coredata和sqlite数据库来将数据保存在我的应用程序中。但是,每次我杀了我的应用程序,我都会丢失保存在数据库中的任何数据。我很确定它是因为我的数据库的.sqlite文件只是在每次我的应用程序启动时被一个新的.sqlite文件替换,但我似乎无法找到任何只使用现有的代码的代码。 如果任何人都可以指向我一些可以为我处理这个问题的代码,那将会很棒。iOS 5 - Coredata Sqlite数据库在丢失应用程序后丢失数据

干杯

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator 
{ 
if (__persistentStoreCoordinator != nil) 
{ 
    return __persistentStoreCoordinator; 
} 

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber  numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];  
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"FlickrCoreData.sqlite"]; 

NSError *error = nil; 
__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) 
{ 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
}  

return __persistentStoreCoordinator; 
} 
+0

每次写入商店时都必须使用相同的ManagedObjectContext。你如何将数据写入moc以及如何将ManagedObjectContext传递给其他控制器。 – 2012-03-18 20:16:30

回答

3

在为了优化目的而进行更改时,不会保存对核心数据中受管对象上下文的更改。通过这种方式,您可以对上下文进行一系列更改,然后一次保留所有更改。因此,如果您在有机会自动保存之前将您的应用程序杀死,您将丢失所有数据。我猜这是你在这里遇到的。

在任何情况下,请尝试在关闭应用程序之前明确拨打电话以保存您的数据。这应该可以解决你的问题。

例如,假设你有一个存放名为context你可以在你的代码进行以下调用保存在某个地方的情况下你的管理对象上下文关闭该应用程序之前一个变量:

[context save:&error]或者干脆[context save:nil]

+0

嗨杰克,我的AppDelegate确实调用保存在applicationDidTerminate方法的上下文。你是这个意思吗? – 2012-03-18 19:44:12

+0

是的 - 不想告诉你究竟在哪里放置保存电话,因为这取决于什么最适合您的节目结构。然而,我会说把它放在'Will ...'委托方法之一,即'applicationWillTerminate' - 这样你给程序一点时间来实际存储。 – 2012-03-18 19:57:33

+1

谢谢你。我实际上不得不从'applicationDidEnterBackground'中调用'[context save:&error]'。根据文档“如果您的应用程序支持后台执行,则在用户退出时调用此方法,而不是applicationWillTerminate:”。 – 2012-03-18 20:13:34

1

有你在的appDelegate功能applicationWillTerminate:试图地方[self saveContext]。您应该在终止应用程序之前保存上下文。

+0

嘿。是的,那个代码已经在那里了。 – 2012-03-18 18:26:23

+0

这是什么代码? 'NSDictionary * options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],NSMigratePersistentStoresAutomaticallyOption,[NSNumber numberWithBool:YES],NSInferMappingModelAutomaticallyOption,nil];'我认为默认的是nil? – Lunayo 2012-03-18 18:33:03

+0

当您更新数据模型的版本时,它处理数据迁移。我试图用零作为值而不是选项,但它没有任何区别。 – 2012-03-18 19:42:47