2015-04-17 68 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

这个举动对我来说很奏效,虽然你可能会更好的移民 –