CloudKit:CKRecord 问题(或错误?)的 creatorUserRecordID
CloudKit: creatorUserRecordID of CKRecord Issue (or Bug?)
iOS8.3后,如果记录是当前账号创建的,其creatorUserRecordID会像
CKRecordID: [Some Address]; defaultOwner:(_defaultZone:defaultOwner)
然后如果使用 fetchRecordWithID:completionHandler: 从 CKDatabase 获取此 recordID,它将始终 return 错误,如
CKError [Some Address]: "Unknown Item" (11/2003); server message = "Record not found"; uuid = [Some UUID]; container ID = [Some Container ID]
我以前从未遇到过这个问题。
这是一个错误,还是我应该像这样(defaultOwner)以其他方式从 recordID 获取记录?
编辑(添加示例代码)
- (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 中修复了这个问题。
确实看起来像新功能。
你可以做的是首先测试 eachRecord.creatorUserRecordID.recordName == "defaultOwner" 如果是这样你可以获取你得到的 ID 的记录来自 currentUserRecordID
但最好不要将 creatorUserRecordID 用于您应用中的任何功能。您最好添加一个新的 CKReference 字段并始终用 currentUserRecordID 填充它。那么即使您有一个迁移数据的过程,您仍然会知道最初是谁创建了该记录。
也许这会有所帮助:我发现如果您在应用程序工作流程的开头使用 [CKFetchRecordsOperation fetchCurrentUserRecordOperation],您将不会突然出现 defaultOwner CKRecordID .
iOS8.3后,如果记录是当前账号创建的,其creatorUserRecordID会像
CKRecordID: [Some Address]; defaultOwner:(_defaultZone:defaultOwner)
然后如果使用 fetchRecordWithID:completionHandler: 从 CKDatabase 获取此 recordID,它将始终 return 错误,如
CKError [Some Address]: "Unknown Item" (11/2003); server message = "Record not found"; uuid = [Some UUID]; container ID = [Some Container ID]
我以前从未遇到过这个问题。
这是一个错误,还是我应该像这样(defaultOwner)以其他方式从 recordID 获取记录?
编辑(添加示例代码)
- (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 中修复了这个问题。
确实看起来像新功能。
你可以做的是首先测试 eachRecord.creatorUserRecordID.recordName == "defaultOwner" 如果是这样你可以获取你得到的 ID 的记录来自 currentUserRecordID
但最好不要将 creatorUserRecordID 用于您应用中的任何功能。您最好添加一个新的 CKReference 字段并始终用 currentUserRecordID 填充它。那么即使您有一个迁移数据的过程,您仍然会知道最初是谁创建了该记录。
也许这会有所帮助:我发现如果您在应用程序工作流程的开头使用 [CKFetchRecordsOperation fetchCurrentUserRecordOperation],您将不会突然出现 defaultOwner CKRecordID .