CloudKit:CKRecord问题的creatorUserRecordID(或Bug?)

时间:2015-04-13 04:16:46

标签: ios cloudkit

在iOS 8.3之后,如果记录是由当前帐户创建的,则其creatorUserRecordID将类似

  

CKRecordID:[Some Address];的 defaultOwner :(_ defaultZone:的 defaultOwner

然后如果使用fetchRecordWithID:completionHandler:从CKDatabase获取此recordID,它将始终返回错误,如

  

CKError [Some Address]:“Unknown Item”(11/2003); server message =“找不到记录”; uuid = [Some UUID];容器ID = [某些容器ID]

我之前从未遇到过这个问题。

这是一个错误,还是应该以其他方式从recordID( defaultOwner )中获取记录?

编辑(添加示例代码)

- (void)postMoodFeed:(NSString *)moodFeed
{
    CKRecord *moodRecord = [[CKRecord alloc] initWithRecordType:@"Mood"];
    moodRecord[@"moodFeed"] = moodFeed

    [[[CKContainer defaultContainer] publicCloudDatabase] saveRecord:moodRecord completionHandler:^(CKRecord *record, NSError *error) {
        [self queryMyMood];
    }];
}

- (void)queryMyMood
{
    // currentUserRecordID is fetched from fetchUserRecordIDWithCompletionHandler: of CKContainer
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"creatorUserRecordID = %@", currentUserRecordID];

    CKQuery *query = [[CKQuery alloc] initWithRecordType:@"Mood" predicate:predicate];

    [[[CKContainer defaultContainer] publicCloudDatabase] performQuery:query inZoneWithID:nil completionHandler:^(NSArray *results, NSError *error) {
        if (results) {
            for (CKRecord *eachRecord in results) {
                // Following logs are all __defaultOwner__
                NSLog(@"%@", eachRecord.creatorUserRecordID.recordName);
                [[[CKContainer defaultContainer] publicCloudDatabase]fetchRecordWithID:eachRecord.creatorUserRecordID completionHandler:^(CKRecord *record, NSError *error) {
                    // All following logs are "Unknown item" error
                    NSLog(@"%@", error);
                }];
            }
        }
    }];
}

编辑 2015年7月2日

这是一个错误。

向Apple报告后,他们在iOS 9 Beta 2中修复了此问题。

2 个答案:

答案 0 :(得分:1)

确实看起来像是新功能。

您可以做的是首先测试eachRecord.creatorUserRecordID.recordName ==" defaultOwner "如果是这样的话你就可以获取你从currentUserRecordID获得的ID的记录

但最好不要将creatorUserRecordID用于应用中的任何功能。您可以更好地添加新的CKReference字段,并始终使用currentUserRecordID填充它。然后,即使您有一个迁移数据的进程,您仍然可以知道谁最初创建了该记录。

答案 1 :(得分:0)

也许这会有所帮助:我发现如果你在应用程序的工作流程开始时使用[CKFetchRecordsOperation fetchCurrentUserRecordOperation],你就不会有 defaultOwner CKRecordIDs无处不在。