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

我在现有的应用程序中使用核心数据。 现在我想集成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_; } 

使用该代码,所有新添加的数据logging都会在所有iOS设备之间自动同步,所以它的工作方式应该完全相同!

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

我需要做些什么才能使所有现有的数据logging与iCloud同步呢? 我已经尝试了一下这个方法

 migratePersistentStore:toURL:options:withType:error: 

但没有任何成功。

我非常感谢任何帮助!

查看WWDC 2012会话在iCloud上使用CoreData。 他们在最后一节讨论这个问题,主题是播种。 他们也有一些示例代码,你可以从网站上得到一个例子。 总之,你将不得不打开2个持久性存储,设置一个抓取大小,然后从源头抓取批量,循环遍历它们,并将它们添加到新的商店,并以批量大小间隔保存和重置。 很简单。

查看WWDC 2012 – 使用iCloud的核心数据。 这种技术被称为播种。 在https://github.com/jab5990/TestCDiCloud/tree/master/Shared查找示例代&#x7801;