如何在已经使用本地存储核心数据的应用程序中启用iCloud核心数据?
我尝试在我的持久性存储选项中使用NSPersistentStoreUbiquitousContentNameKey
。不幸的是,此选项启用了iCloud,但不会将任何本地数据传输到iCloud。我似乎也无法使migratePersistentStore:toURL:options:withType:error:
正常工作。我提供了持久性存储,其URL,iCloud选项等,它仍然不会将现有的本地数据迁移到iCloud。这是我使用方法的方式:
- (void)migratePersistentStoreWithOptions:(NSDictionary *)options {
NSError *error;
self.storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:[NSString stringWithFormat:@"%@.sqlite", self.SQLiteFileName]];
NSPersistentStore *store = [self.persistentStoreCoordinator migratePersistentStore:self.persistentStoreCoordinator.persistentStores.firstObject toURL:self.storeURL options:options withType:NSSQLiteStoreType error:&error];
if (store) NSLog(@"[CoreData Manager] Store was successfully migrated");
else NSLog(@"[CoreData Manager] Error migrating persistent store: %@", error);
}
本地存储仍然与iCloud存储分开。如果可能的话,我想将本地核心数据移至iCloud,而无需手动转移每个实体。
有任何想法吗?我可以找到很多有关从iCloud移回本地存储的文章,教程和帖子-但我想将从本地存储移至iCloud 。
最佳答案
这是您需要做的
这是代码,内联注释。
NSURL *documentsDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
//This is the path to the new store. Note it has a different file name
NSURL *storeURL = [documentsDirectory URLByAppendingPathComponent:@"TestRemote.sqlite"];
//This is the path to the existing store
NSURL *seedStoreURL = [documentsDirectory URLByAppendingPathComponent:@"Test.sqlite"];
//You should create a new store here instead of using the one you presumably already have access to
NSPersistentStoreCoordinator *coord = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];
NSError *seedStoreError;
NSDictionary *seedStoreOptions = @{ NSReadOnlyPersistentStoreOption: @YES };
NSPersistentStore *seedStore = [coord addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:seedStoreURL
options:seedStoreOptions
error:&seedStoreError];
NSDictionary *iCloudOptions = @{ NSPersistentStoreUbiquitousContentNameKey: @"MyiCloudStore" };
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//This is using an operation queue because this happens synchronously
[queue addOperationWithBlock:^{
NSError *blockError;
[coord migratePersistentStore:seedStore
toURL:storeURL
options:iCloudOptions
withType:NSSQLiteStoreType
error:&blockError];
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
[mainQueue addOperationWithBlock:^{
// This will be called when the migration is done
}];
}];
请注意,执行此迁移后,您需要使用新的URL配置与MOC一起使用的持久性存储,并始终将上面的iCloudOptions与NSPersistentStoreUbiquitousContentNameKey key 一起包括在内。
这基于Apple's documentation。
完成后,您应该在模拟器文件夹(〜/Library/Application Support/iPhone Simulator/...)的Documents文件夹中看到一个名为CoreDataUbiquitySupport的新文件夹。嵌套在您的iCloud同步sqlite商店的深处。
多田
编辑:哦,请确保您已经创建了iCloud权利,并将其包括在包中。您应该能够在Xcode中完成所有操作,但是您也可以在开发门户上对其进行更新。
关于ios - 将本地核心数据移动到iCloud,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25295829/