簡體   English   中英

如何從 CloudKit CKRecord 獲取 CoreData NSManagedObject?

[英]How do you get the CoreData NSManagedObject from a CloudKit CKRecord?

我使用 CoreData 進行本地存儲,使用 CloudKit 處理雲同步。 我已經設置了 CloudKit 訂閱來檢測遠程更改。 這些通知提供了一個CKRecord表示添加的數據。 記錄會自動與 CoreData 存儲同步。 如何將CKRecordNSManagedObject協調一致? 我需要能夠以與直接從 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM