2015-12-16 1 views
0

Когда я выполняю этот код:Запросы по результатам RecordId в «Внутренняя ошибка сервера»

CKDatabase *publicDatabase = [[CKContainer defaultContainer] publicCloudDatabase]; 
CKRecordID *recordID = [[CKRecordID alloc] initWithRecordName: @"95263874-C860-4190-A2BB-08B3E652B7AA"]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"%K == %@", @"recordID", [[CKReference alloc] initWithRecordID: recordID action: CKReferenceActionNone]]; 
CKQuery  *query  = [[CKQuery alloc] initWithRecordType: @"Case" predicate: predicate]; 
[publicDatabase performQuery: query inZoneWithID: nil completionHandler: ^(NSArray *results, NSError *error) { 
    if (error) { 
     NSLog(@"Error = %@", error); 
    } else { 
     NSLog(@"Success"); 
    } 
}]; 

Я получаю эту ошибку:

<CKError 0x618000042670: "Server Rejected Request" (15/2000); server message = "Internal server error"; uuid = 122AB9AA-6949-442D-B9D7-736A5B7D2EE5; container ID = "iCloud.net.xxxxxxx">

Однако, если изменить предикат к этому:

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"PatientName = %@ ", @"Doe, John"]; 

Восстановление выполняется правильно. Я подтвердил, что у Джона Доу есть рекордное имя, которое я ищу. Я также попытался переключить iCloud «Возможности» в настройках проекта. Я потратил часы и часы на эту проблему и попробовал много вариантов. Ничего не работает!

+1

Если вы знаете идентификатор записи, вы должны получить запись с помощью 'CKFetchRecordsOperation' или, по крайней мере, использовать' fetchRecordWithID: completeHandler: '. Либо лучше, чем использовать 'performQuery', когда вы знаете идентификатор записи. – rmaddy

+0

Спасибо за предложение, и оно работает! Если вы ответите на этот вопрос, я буду отмечать его как принятый. – user1092808

ответ

1

Убедитесь, что вы отметили идентификатор записи как запрошенный для этого типа записи в CloudKit Dashboard.

Выберите тип записи и нажмите "Индексы метаданных". Установите флажок «Запрос» рядом с полем «Идентификатор записи», и эта ошибка должна исчезнуть.

Кроме того, ответ rmaddy прав - если вы просто пытаетесь получить запись по ее идентификатору, вы должны использовать CKFetchRecordsOperation вместо запроса.

+0

Люди сервера CloudKit рассматривают это как потенциальную ошибку - это может быть не то, что ваш код делает неправильно. Тем не менее, вам все равно нужно отметить это свойство как запрошенное, а предложение rmaddy использовать 'CKFetchRecordsOperation' по-прежнему является лучшим способом найти запись по его идентификатору. – farktronix

+0

Таблица запрашивается, так что, к сожалению, это не решение. Я перейду на использование этого предложения @maddy. – user1092808

+1

Кажется странным, что двухлетний продукт должен возвращать «Внутренние ошибки сервера» @farttronix. – user1092808