您如何从CloudKit CKRecord获取CoreData NSManagedObject?

我正在使用CoreData进行本地存储,并使用CloudKit处理云同步。我已设置CloudKit订阅以检测远程更改。这些通知提供了一个CKRecord,代表添加的数据。记录将自动与CoreData存储同步。如何将CKRecordNSManagedObject进行对帐?我需要能够以与直接从CoreData提取实体相同的方式与之交互。

这是我一直在代码方面进行的工作。问题在于,标识CloudKit中记录的recordName字段在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;
}
clshz2009 回答:您如何从CloudKit CKRecord获取CoreData NSManagedObject?

我不知道是否有更好的方法,但是最终我在CoreData数据库中添加了一个名为cloudID的字段。每次创建一个NSManagedObject实例并将其插入数据库时​​,其cloudID都会设置为[NSUUID UUID]。这被推到CloudKit中的同一字段,因此我可以用它来将CloudKit CKRecord与CoreData NSManagedObject匹配。

本文链接:https://www.f2er.com/3170009.html

大家都在问