gpt4 book ai didi

ios - 将本地核心数据移动到 iCloud

转载 作者:IT王子 更新时间:2023-10-29 08:19:18 33 4
gpt4 key购买 nike

如何在已使用本地存储核心数据的应用中启用 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

最佳答案

这是你需要做的

  1. 创建本地 NSPersistentStoreCoordinator
  2. 将您现有的持久存储添加到该协调器,并存储对这个新返回存储的引用。
  3. 调用方便的 migratePersistStore:... 提供来自 #2 的商店、文档目录中具有不同文件名的商店的 URL 以及包括 NSPersistentStoreUbiquitousContentNameKey key 在内的所有重要选项。

这是代码,内联注释。

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 键中。

这是基于 Apple's documentation .

完成后,您应该会在模拟器文件夹 (~/Library/Application Support/iPhone Simulator/...) 的 Documents 文件夹中看到一个标有 CoreDataUbiquitySupport 的新文件夹。嵌套在你的 iCloud 同步 sqlite 商店的深处。

多田!


编辑:哦,请确保您已创建 iCloud 授权并将其包含在您的 bundle 中。您应该能够在 Xcode 中完成这一切,但您也可以在开发门户网站上更新它。

关于ios - 将本地核心数据移动到 iCloud,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25295829/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com