Как вы получаете CoreData NSManagedObject из CloudKit CKRecord? - PullRequest
0 голосов
/ 04 ноября 2019

Я использую 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;
}

1 Ответ

0 голосов
/ 04 ноября 2019

Я не знаю, есть ли лучший способ, но я закончил тем, что добавил в свою базу данных CoreData поле с именем cloudID. Каждый раз, когда экземпляр NSManagedObject создается и вставляется в базу данных, его cloudID устанавливается на [NSUUID UUID]. Это помещается в то же поле в CloudKit, поэтому я могу использовать его для сопоставления CloudKit CKRecord с CoreData NSManagedObject.

...