Tôi đang sử dụng Dữ liệu cốt lõi trong một ứng dụng hiện có. Bây giờ tôi muốn tích hợp iCloud để người dùng có thể đồng bộ hóa nội dung giữa các thiết bị iOS của họ. Để làm được điều mà tôi đã viết đoạn code sau cho NSPersistentStoreCoordinator tôi (dĩ nhiên là placeholders được điền trong mã của tôi):iOS: Di chuyển cơ sở dữ liệu lõi dữ liệu hiện có vào iCloud
- (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_;
}
Với mã tất cả thêm bản ghi dữ liệu mới được đồng bộ hóa tự động giữa tất cả iOS- các thiết bị, do đó hoạt động chính xác theo cách của nó!
Nhưng điều tôi muốn cũng là tất cả các bản ghi dữ liệu hiện có được đồng bộ hóa giữa tất cả các thiết bị; vẫn chưa hoạt động. Các bản ghi hiện có vẫn có sẵn trong ứng dụng và có thể được sử dụng, nhưng chúng không được đồng bộ hóa.
Tôi cần phải làm gì để có được tất cả các bản ghi dữ liệu hiện có được đồng bộ hóa với iCloud? Tôi đã thử nghiệm một chút với phương pháp
migratePersistentStore:toURL:options:withType:error:
nhưng không thành công.
Tôi rất biết ơn vì bất kỳ trợ giúp nào!
Bạn cần một số mã đặc biệt để di chuyển dữ liệu hiện có. Google xung quanh - đã có giải pháp rồi. Bạn cũng có thể xem chủ đề này trên diễn đàn của Apple Developer - https://devforums.apple.com/thread/126670?tstart=0 bạn phải có một id nhà phát triển hợp lệ để truy cập nó. Nhìn vào cuối của sợi đầu tiên (nó khá dài). –