2015-12-16 44 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"]; 

檢索工作正常。我已經證實John Doe有我正在尋找的記錄名。我也嘗試在項目設置中切換iCloud「功能」。我花了幾個小時在這個問題上,並嘗試了很多變化。沒有用!

+1

如果您知道記錄ID,您應該使用'CKFetchRecordsOperation'或至少使用'fetchRecordWithID:completionHandler:'獲得記錄。當你知道記錄ID時,要麼比使用'performQuery'要好。 – rmaddy

+0

感謝您的建議,它的工作原理!如果您將此作爲答案,我會將其標記爲已接受。 – user1092808

回答

1

確保您在CloudKit Dashboard中將此記錄類型的記錄標識標記爲可查詢。

選擇您的記錄類型,然後單擊「元數據索引」。選中記錄ID字段旁邊的查詢複選框,此錯誤應該消失。

除此之外,rmaddy的答案是正確的 - 如果你只是想通過它的標識符獲取記錄,你應該使用CKFetchRecordsOperation而不是查詢。

+0

CloudKit服務器人員正在將此視爲潛在錯誤 - 這可能不是您的代碼做錯的任何事情。但是,您仍然需要將該屬性標記爲可查詢,並且rmaddy使用'CKFetchRecordsOperation'的建議仍然是通過ID查找記錄的更好方法。 – farktronix

+0

表是可查詢的,所以不幸的是,這不是解決方案。我會轉換使用@maddy建議的。 – user1092808

+1

一個兩歲的產品應該返回@farttronix的「內部服務器錯誤」似乎很奇怪。 – user1092808

相關問題