我正在使用CoreData进行本地存储,并使用CloudKit处理云同步。我已设置CloudKit订阅以检测远程更改。这些通知提供了表示所添加数据的CKRecord
。记录将自动与CoreData存储同步。如何将CKRecord
与NSManagedObject
和好?我需要能够以与直接从CoreData提取实体相同的方式与之交互。
这里是我一直在代码方面进行的工作。问题是在CoreData存储中不存在用于标识CloudKit中的记录的recordName
字段,因此我得到了未处理的异常。但是我不知道哪个字段(如果有)与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中的相同字段,因此我可以用它来将CloudKit CKRecord
与CoreData NSManagedObject
匹配。