核心数据将数据移动到共享容器中

时间:2015-04-17 13:15:25

标签: iphone xcode core-data watchkit today-extension

我已经发布了一款使用核心数据的应用 现在我想添加对手表套件和今天扩展的支持。

我需要将核心数据移动到共享容器中而不会丢失以前用户保存的数据,我该如何以最佳方式执行此操作?

2 个答案:

答案 0 :(得分:5)

您可以迁移核心数据堆栈。 A fuller answer can be found here,但简短版本是:

  1. 检查数据的旧非组副本是否存在
  2. 如果是,请使用该文件设置Core Data堆栈。然后使用migratePersistentStore:toURL:options:withType:error:将其移至新位置。然后删除旧副本。
  3. 如果旧版本不存在,只需像往常一样使用新副本设置核心数据。
  4. Stephen's答案的问题在于它假设核心数据堆栈是单个SQLite文件,并不总是如此。)

答案 1 :(得分: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];
}