2012-09-13 42 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

相關問題