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

Iphone 核心数据将数据移动到共享容器中,iphone,xcode,core-data,watchkit,today-extension,Iphone,Xcode,Core Data,Watchkit,Today Extension,我已经发布了一个使用核心数据的应用程序。 现在我想添加对watch kit和today扩展的支持 我需要在不丢失以前用户保存的数据的情况下将核心数据移动到共享容器中,如何才能以最佳方式做到这一点?以下是我在应用程序中将核心数据移动到共享容器中的方法。我会在应用程序启动时执行此操作 NSUserDefaults* sharedDefs = [GPMapCore sharedCore].sharedUserDefaults; if (![sharedDefs boolForKey:@"CoreDat

我已经发布了一个使用核心数据的应用程序。
现在我想添加对watch kit和today扩展的支持


我需要在不丢失以前用户保存的数据的情况下将核心数据移动到共享容器中,如何才能以最佳方式做到这一点?

以下是我在应用程序中将核心数据移动到共享容器中的方法。我会在应用程序启动时执行此操作

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];
}
您可以迁移核心数据堆栈,但简短的版本是:

  • 检查数据的旧非组副本是否存在
  • 如果有,请使用该文件设置核心数据堆栈。然后使用
    migratePersistentStore:toURL:options:withType:error:
    将其移动到新位置。然后删除旧副本
  • 如果旧版本不存在,只需像往常一样使用新副本设置核心数据

  • (答案的问题是,它假设核心数据堆栈是一个SQLite文件,这并不总是正确的。)

    moveItem是否足够,或者我们是否需要实际迁移PersistentStore:toURL:options:withType:error:虽然迁移可能会让您感觉更好,但移动对我来说是可行的