ios - 如何从 CloudKit CKRecord 获取 CoreData NSManagedObject?
问题描述
我使用 CoreData 进行本地存储,使用 CloudKit 处理云同步。我已经设置了 CloudKit 订阅来检测远程更改。这些通知提供了一个CKRecord
表示添加的数据。记录会自动与 CoreData 存储同步。我怎样才能调和CKRecord
到一个NSManagedObject
?我需要能够以与直接从 CoreData 获取实体相同的方式与之交互。
这是我一直在处理代码方面的事情。问题是recordName
在 CloudKit 中标识记录的字段在 CoreData 存储中不存在,所以我得到一个未处理的异常。但我不知道哪个字段(如果有)将匹配 CloudKit 记录的名称字段。
//CKRecord+NSManagedObject
- (NSManagedObject*)managedObject {
NSPersistentCloudKitContainer *container = [CoreDataFunctions persistentContainer];
NSManagedObjectModel *managedObjectModel = container.managedObjectModel;
NSDictionary *entitiesByName = managedObjectModel.entitiesByName;
NSString *recordType = [self.recordType stringByReplacingOccurrencesOfString:@"CD_" withString:@""];
NSEntityDescription *entityDescription = [entitiesByName valueForKey:recordType];
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:entityDescription.name];
fetchRequest.fetchLimit = 1;
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"recordName == %@", self.recordID.recordName];
NSError *error = nil;
NSArray *results = [[CoreDataFunctions managedObjectContext] executeFetchRequest:fetchRequest error:&error];
NSManagedObject *managedObject;
if (error) {
NSLog(@"Error %@", error);
}
else {
if (results.count == 0) {
NSLog(@"No result");
}
else {
managedObject = results.firstObject;
NSLog(@"%@", managedObject.entity.propertiesByName);
}
}
return managedObject;
}
解决方案
我不知道是否有更好的方法,但我最终在我的 CoreData 数据库中添加了一个名为cloudID
. 每次NSManagedObject
创建实例并将其插入数据库时,其cloudID
设置为[NSUUID UUID]
. 这会被推送到 CloudKit 中的同一字段,因此我可以使用它来匹配 CloudKitCKRecord
和 CoreData NSManagedObject
。
推荐阅读
- sql - 带条件的循环标识符
- laravel - Laravel 个人资料照片仅有时显示
- css - 带有 css `hyphens` 的自动换行无法换行子字符串
- xamarin - Visual Studio 2019 Xamarin Dotfuscator CE 配置文件创建问题
- r - R - 删除所有不符合特定条件的行
- javascript - 如何在单击带有 Node.js 和 HTML 的按钮时发送带有特定 URL 的 POST 请求?
- azure - Azure 管道在使用模板时展开每个参数
- unit-testing - 创建 JWT 以测试受 Auth0 保护的 API
- python - 如何在 anacoda (windows 10) 中将 Python 3.8.8 降级到 3.7.9
- python - OR STATEMENT TypeError:'str'和'int'的实例之间不支持'<'