2012-09-13 44 views
3

我有一个核心数据应用程序将其sqlite数据库备份到Dropbox,用户可以通过覆盖当前数据库来恢复它(如果/当他们需要。如何在核心数据模型发生变化(轻量级迁移)后从备份恢复SQLite数据库

在下一个应用程序版本中,核心数据模型已更改,现有用户的数据库将通过轻量级迁移过程自动更新。

我的问题是已经备份的数据库。如果用户去恢复在迁移之前备份的sqlite数据库,它将不匹配最新的模型,并且会使应用程序崩溃。

有什么办法可以在还原过程中更新数据库,以匹配我的核心数据模型?我可以运行一个流程,还是采取一些步骤来确保备份不会丢失?

+0

这仍然是我的问题。我担心我的用户会尝试下载他们的旧SQLite文件,当他们被告知他们需要首先创建新的备份时,他们会感到愤怒。任何人都可以解决这个问题吗? – SAHM

+0

我试图解决同样的问题...你有没有想出一个解决方案呢? – cowfaboo

+0

是的,实际上我刚恢复数据库(如下所述),轻量级迁移已经发生,并且一切正常。我很高兴地感到惊讶。你试过了吗? – SAHM

回答

1

轻量级迁移确实会自动发生,如果你打开一个包含核心数据的sqlite数据库。主要是作为应用程序更新的一部分,但也是在打开还原的数据库时。

你可以添加一个检查,看看是否迁移是必要的恢复后:

-(BOOL) storeRequiresMigration: (NSURL *) storeURL { 
NSError *error = nil; 
NSPersistentStoreCoordinator * temporaryPersistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 

//Check if migration is needed 
NSDictionary *sourceMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType URL:storeURL error:&error]; 
NSManagedObjectModel *destinationModel = [temporaryPersistentStoreCoordinator managedObjectModel]; 
BOOL isCompatibile = [destinationModel isConfiguration:nil compatibleWithStoreMetadata:sourceMetadata]; 
NSLog(@"Store requires migration: %d", !isCompatibile); 
return !isCompatibile; 

}

0

只要您在应用程序中保留以前的数据模型版本,轻量级迁移就应该为您处理此过程。从你的问题来看,我相信这正是轻量级迁移所关注的。它推断出以前数据模型版本的更改并将旧数据映射到新数据模型中

在特殊情况下,您希望重命名数据模型中的某些内容,可以使用位于检查器中的重命名ID在“版本控制”下。

+0

感谢bbodayle,但要澄清:用户将手动恢复sqlite数据库,将其替换为从Dropbox下载的数据库。然后,我采取措施根据新下载的数据库重置数据。在这个过程中没有任何事情会自动发生 - 这里没有轻量级的迁移。轻量级迁移仅在用户更新应用程序时发生。因此,在这种情况下,用户拥有一个应用程序,在该应用程序中数据已被迁移,并试图用旧版本的数据库替换已更新的数据库。 – SAHM

相关问题