iOS:将现有核心数据数据库迁移到 iCloud

Posted

技术标签:

【中文标题】iOS:将现有核心数据数据库迁移到 iCloud【英文标题】:iOS: Migrating existing Core Data-database into iCloud 【发布时间】:2012-04-26 07:49:21 【问题描述】:

我在现有应用程序中使用 Core Data。现在我想集成 iCloud,以便用户可以在他们的 ios 设备之间同步他们的内容。为此,我为我的 NSPersistentStoreCoordinator 编写了以下代码(当然占位符已在我的代码中填写):

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator 

if (persistentStoreCoordinator_ != nil) 
    return persistentStoreCoordinator_;


NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"<DB_Name>.sqlite"];

persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

NSPersistentStoreCoordinator* psc = persistentStoreCoordinator_;

if (IOS_VERSION_GREATER_THAN_OR_EQUAL_TO(@"5.0")) 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
        NSFileManager *fileManager = [NSFileManager defaultManager];

        // Migrate datamodel
        NSDictionary *options = nil;

        // this needs to match the entitlements and provisioning profile
        NSURL *cloudURL = [fileManager URLForUbiquityContainerIdentifier:@"<App_Identifier>"];
        NSString* coreDataCloudContent = [[cloudURL path] stringByAppendingPathComponent:@"data"];
        if ([coreDataCloudContent length] != 0) 
            // iCloud is available
            cloudURL = [NSURL fileURLWithPath:coreDataCloudContent];

            options = [NSDictionary dictionaryWithObjectsAndKeys:
                       [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                       [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
                       @"<App_Name>.store", NSPersistentStoreUbiquitousContentNameKey,
                       cloudURL, NSPersistentStoreUbiquitousContentURLKey,
                       nil];
         else 
            // iCloud is not available
            options = [NSDictionary dictionaryWithObjectsAndKeys:
                       [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                       [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
                       nil];
        

        NSError *error = nil;
        [psc lock];
        if (![psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
        
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        
        [psc unlock];

        dispatch_async(dispatch_get_main_queue(), ^
            NSLog(@"asynchronously added persistent store!");
            [[NSNotificationCenter defaultCenter] postNotificationName:@"RefetchAllDatabaseData" object:self userInfo:nil];
        );

    );

 else 
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                             [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
                             nil];

    NSError *error = nil;
    if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
    
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    


return persistentStoreCoordinator_;

使用该代码,所有新添加的数据记录都会在所有 iOS 设备之间自动同步,从而完全按照应有的方式工作!

但我想要的是所有现有数据记录也在所有设备之间同步;那还不行。现有记录在应用程序中仍然可用并且可以使用,但它们不会同步。

我需要做什么才能使所有现有数据记录也与 iCloud 同步?我已经用这个方法做了一些实验

migratePersistentStore:toURL:options:withType:error:

但没有任何成功。

非常感谢您的帮助!

【问题讨论】:

您需要一些特殊的代码来迁移现有数据。谷歌 - 已经有解决方案了。您也可以在 Apple 开发者论坛上查看此主题 - devforums.apple.com/thread/126670?tstart=0 您必须拥有有效的开发者 ID 才能访问它。先看看线程的末尾(它很长)。 【参考方案1】:

查看 WWDC 2012 会议 Using CoreData with iCloud。他们在最后一节的播种主题下讨论了这个问题。他们也有一些示例代码,您可以从有示例的站点获得。简而言之,您将必须打开 2 个持久存储,设置提取大小,然后从源中获取批次,循环它们并将它们添加到新存储中,并以批次大小为间隔,保存并重置。很简单。

【讨论】:

【参考方案2】:

查看 WWDC 2012 - 将核心数据与 iCloud 结合使用。这种技术称为播种。 在https://github.com/jab5990/TestCDiCloud/tree/master/Shared找到示例代码

【讨论】:

以上是关于iOS:将现有核心数据数据库迁移到 iCloud的主要内容,如果未能解决你的问题,请参考以下文章

iCloud 核心数据迁移

将 PersistentStoreCoordinator 从本地迁移到 iCloud 时数据重复

核心数据迁移到 iCloud

在我的应用程序上启用 iCloud 时,现有核心数据数据库未上传到 iCloud

将 Core Data 应用程序迁移到 iCloud

将核心数据与 iCloud 同步 - 不包括实体