iOS: 将现有的Core Data数据库迁移到iCloud

6

我正在一个现有应用程序中使用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:

但是一直没有任何成功的进展。

非常感谢您的帮助!


你需要一些特殊的代码来迁移现有数据。在谷歌上搜索一下 - 已经有了解决方案。你也可以查看苹果开发者论坛上的这个帖子 - https://devforums.apple.com/thread/126670?tstart=0,但你必须拥有有效的开发者ID才能访问它。首先看看帖子的结尾(它相当长)。 - Kostiantyn Sokolinskyi
1个回答

0

查看WWDC 2012会议关于使用CoreData与iCloud的会话。他们在最后一节中讨论了这个话题,其中包括种子播放。他们还提供了一些示例代码,您可以从网站上获取一个示例。简而言之,您需要打开2个持久存储,设置提取大小,然后从源中获取批次,循环遍历它们并将它们添加到新存储中,在批处理大小间隔处保存和重置。非常简单。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接