首页 > 解决方案 > 如何从 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;
}

标签: ioscore-datacloudkitnsmanagedobjectckrecord

解决方案


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


推荐阅读