Sil*_*van 6 migration core-data ios icloud
我在现有应用程序中使用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_;
}
Run Code Online (Sandbox Code Playgroud)
使用该代码,所有新添加的数据记录将在所有iOS设备之间自动同步,因此它的工作方式完全正确!
但我想要的是,所有现有的数据记录都在所有设备之间同步; 那还行不通.现有记录仍然可以在应用程序中使用并且可以使用,但它们不同步.
我还需要做些什么来使所有现有数据记录与iCloud同步?我用这种方法做了一些实验
migratePersistentStore:toURL:options:withType:error:
Run Code Online (Sandbox Code Playgroud)
但没有任何成功.
我非常感谢任何帮助!
查找 WWDC 2012 会议使用 CoreData 和 iCloud。他们在最后一节的种子主题下讨论了这个问题。他们还提供了一些示例代码,您可以从包含示例的网站获取这些代码。简而言之,您必须打开 2 个持久存储,设置获取大小,然后从源中获取批次,循环遍历它们并将它们添加到新存储中,并以批次大小间隔保存并重置。很简单。
| 归档时间: |
|
| 查看次数: |
2885 次 |
| 最近记录: |