2015-04-17 80 views
6

我有已經發布的使用核心數據的應用程序。
現在我想添加對手錶套件和今天擴展的支持。核心數據將數據移入共享容器

我需要的核心數據移動到共享的容器,但未保存的數據就會丟失以前的用戶,我怎麼能做到這一點的最好方法是什麼?

回答

4

可以遷移核心數據堆棧。 A fuller answer can be found here,但短期的版本是:

  1. 檢查是否存在
  2. 數據的舊的非組副本如果是的話,設置使用該文件核心數據堆棧。然後使用migratePersistentStore:toURL:options:withType:error:將其移至新位置。然後刪除舊的副本。
  3. 如果舊版本不存在,只需像往常一樣使用新副本設置Core Data。

(與Stephen's回答的問題是,它假設核心數據堆棧是一個單一的SQLite文件,它並不總是正確的。)

+0

Thaks,那答案更完整...... –

2

這裏是我移動的核心數據,在我的應用程序共享的容器。我在應用啓動時執行此操作。

NSUserDefaults* sharedDefs = [GPMapCore sharedCore].sharedUserDefaults; 
if (![sharedDefs boolForKey:@"CoreDataMovedToExtension"]) 
{ 
    NSURL* oldLocation = GET_LOCATION_OF_CORE_DATA_SQLITE_FILE(); 
    NSURL* newLocation = GET_LOCATON_TO_MOVE_THE_SQLITE_FILE_TO(); 

    if ([[NSFileManager defaultManager] fileExistsAtPath:[oldLocation filePathString]]) 
    { 
     //Check if a new file exists. This can happen when the watch app is run before 
     //Topo Maps+ runs and move the core data database 
     if ([[NSFileManager defaultManager] fileExistsAtPath:[newLocation filePathString]]) 
     { 
      [[NSFileManager defaultManager ] removeItemAtURL:newLocation error:nil]; 
     } 

     [[NSFileManager defaultManager] moveItemAtURL:oldLocation toURL:newLocation error:nil]; 
    } 

    [sharedDefs setBool:YES forKey:@"CoreDataMovedToExtension"]; 
    [sharedDefs synchronize]; 
} 
+0

是在移動選項不夠還是我們真的需要migratePersistentStore:的toURL :options:withType:error: –

+0

這個舉動對我來說很奏效,雖然你可能會更好的移民 –