2012-08-03 57 views
3

我有一個CoreData數據庫與我的應用程序完美配合。數據庫存儲由用戶保存的預設。我想讓用戶能夠使用通過iTunes進行文件共享來備份數據庫。用NSFileManager替換CoreData persistantStore是否安全?

基本上我想:

  1. 備份:數據庫 - >文件中的用戶可以在設備之間傳輸

  2. 還原:文件 - >數據庫

的最直接方式我以爲只是複製並替換persistentStore。像這樣..

這是我如何創建數據庫:

self.database = [[UIManagedDocument alloc] databaseURL]; 
if (![[NSFileManager defaultManager] fileExistsAtPath:[self.database.fileURL path]]) { 
    [self.database saveToURL:self.database.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) { }]; 

}

這是我如何更換persistentStore:

- (void)restoreBackupWithBackupURL:(NSURL *)backupURL { 
// close the current document 
[self.database closeWithCompletionHandler:^(BOOL success) {   
    // GET PERSISTENT STORE URL 
    NSURL *databaseURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
    databaseURL = [databaseURL URLByAppendingPathComponent:@"Default Database"]; 
    databaseURL = [databaseURL URLByAppendingPathComponent:@"StoreContent"]; 
    databaseURL = [databaseURL URLByAppendingPathComponent:@"persistentStore"]; 

    // DELETE PERSISTENT STORE 
    NSError *error; 
    BOOL deleted = [[NSFileManager defaultManager] removeItemAtURL:databaseURL error:&error]; 
    if (!deleted) { 
     NSLog(@"Error deleting file: %@", error.localizedDescription); 
     return; 
    } 

    // COPY BACKUP PERSISTENT STORE 
    BOOL copied = [[NSFileManager defaultManager] copyItemAtURL:backupURL toURL:databaseURL error:&error]; 
    if (!copied) { 
     NSLog(@"Error copying file: %@", error.localizedDescription); 
     return; 
    } 

    // INITIALIZE 
    NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
    url = [url URLByAppendingPathComponent:@"Default Database"]; 

    self.database = [[UIManagedDocument alloc] initWithFileURL:url]; 
}];  

}

我有它工作,但是,我不確定它是否是一個安全和首選的解決方案(核心數據新手)。任何輸入?

回答

0

如果您的使用足夠簡單,一般情況下應該可以。

如果您對較大的二進制數據使用外部鏈接,則還需要複製這些文件。

如果使用文件包(或UIManagedDocument),則需要整個文件包,而不僅僅是sql存儲。

如果您使用的是iCloud,您還有其他一些問題需要擔心......

+1

感謝您的回覆。文件包不能通過iTunes文件共享傳輸到應用程序,所以我無法複製整個目錄。我目前只複製並替換persistentStore(將其重新放回到現有文件包(Default Database/StoreContent)中的適當位置,並且它似乎正常工作。 您認爲這樣做沒有問題嗎?如果沒有,我會需要複製整個文件包,爲什麼是這種情況? – Alexander 2012-08-03 20:18:31