2016-02-03 36 views
1

我正在學習使用CloudKit,並最終設法檢索/查詢硬編碼到儀表板的數據。我試圖使用CKQueryOperation從記錄中只查詢一個值,但我總是收到每個記錄中的所有值。 在我的代碼下面,我嘗試使用desiredKey財產得到公正的「年齡」的價值觀 - 我得到的回覆是「年齡」,「名字」,「姓氏」等等等等從CloudKit中的記錄中檢索一個值

let container = CKContainer.defaultContainer() 
let publicData = container.publicCloudDatabase 

// select all records 
let predicate = NSPredicate(format: "TRUEPREDICATE", argumentArray: nil) 
let query = CKQuery(recordType: "quizRecord", predicate: predicate) 

// get just one value only 
let operation = CKQueryOperation(query: query) 
operation.desiredKeys = ["age"] 


    // addOperation 
    publicData.addOperation(operation) 

publicData.performQuery(query, inZoneWithID: nil) { results, error in 
    if error == nil { // There is no error 
     // PROBLEM .. this prints out all values ???? 
     print(results) 
     dispatch_async(dispatch_get_main_queue(), {() -> Void in 
     }) 
    } 
    else { 
     print(error) 
    } 
} 

////以下/修改代碼工作正常

let container = CKContainer.defaultContainer() 
    let publicData = container.publicCloudDatabase 

    // select all records 
    let predicate = NSPredicate(format: "TRUEPREDICATE", argumentArray: nil) 
    let query = CKQuery(recordType: "quizRecord", predicate: predicate) 

    // get just one value only 
    let operation = CKQueryOperation(query: query) 
    operation.desiredKeys = ["age"] 


    // get query 
    operation.recordFetchedBlock = { (record : CKRecord) in 
     // process record 

     print(record) 

    } 


    // operation completed 
    operation.queryCompletionBlock = {(cursor, error) in 
     dispatch_async(dispatch_get_main_queue()) { 
      if error == nil { 

       print("no errors") 
       // code here 

      } else { 

       print("error description = \(error?.description)") 
      } 
     } 
    } 

     // addOperation 
    publicData.addOperation(operation) 

回答

2

問題很簡單。您將desiredKeys設置爲CKQueryOperation,但您從未實際使用該操作。您改爲在數據庫上使用performQuery

如果您使用該操作並將數據限制爲特定鍵,則需要將操作添加到數據庫(使用addOperation:)而不是調用performQuery。當然,您需要爲該操作的一個或多個recordFetchedBlockqueryCompletionBlock屬性指定一個塊。

let container = CKContainer.defaultContainer() 
let publicData = container.publicCloudDatabase 

// select all records 
let predicate = NSPredicate(format: "TRUEPREDICATE", argumentArray: nil) 
let query = CKQuery(recordType: "quizRecord", predicate: predicate) 

// get just one value only 
let operation = CKQueryOperation(query: query) 
operation.desiredKeys = ["age"] 

operation.recordFetchBlock = { (record : CKRecord) in 
    // process record 
} 
operation.queryCompletionBlock = { (cursor : CKQueryCursor!, error : NSError!) in 
    // Query finished 
} 

// addOperation 
publicData.addOperation(operation) 
+0

@maddy。謝謝你的幫助。所以我已經將操作添加到數據庫(上面的代碼編輯),但我不明白我是如何做到這一點,而不是調用performQuery? – pete

+0

正如我所說的,您需要爲「recordFetchedBlock」和「queryCompletionBlock」屬性中的一個或兩個分配一個塊。它在這些塊中處理結果。並且不要同時使用'addOperation'和'performQuery'。只使用一個或另一個。 – rmaddy

+0

@maddy。對不起,當你說使用一個或另一個時,我完全迷失了方向。您可以幫助使用desiredKeys執行查詢的代碼: – pete