CKRecord获得密钥的价值

时间:2015-01-05 01:14:36

标签: ios swift cloudkit ckrecord

我正在尝试根据用户名获取用户的值。我能够使用以下方式获得正确的用户:

class func getByUsername(username: String, callback: (records: [CKRecord]) -> ()){
    getSummary(NSPredicate(format: "Username == %@", username)){(records: [CKRecord]) -> Void in
        callback(records: records)
    }
}

class func getSummary(predicate: NSPredicate, callback: (records: [CKRecord]) -> ()){
    let query = CKQuery(recordType: "UserInfo", predicate: predicate)
    let queryOperation = CKQueryOperation(query: query)
    queryOperation.desiredKeys = ["ID"]

    var records = [CKRecord]()
    queryOperation.recordFetchedBlock = {record in records.append(record)}
    queryOperation.queryCompletionBlock = {_ in callback(records: records)}

    CKContainer.defaultContainer().publicCloudDatabase.addOperation(queryOperation)
}

然后我可以通过以下方式获得正确的记录:

getByUsername("Username"){(records: [CKRecord]) -> Void in
  var record: CKRecord = records[0]
}

我也可以使用

获取正确的ID
var id: String = record.recordID.recordName

所以我知道我正在获取正确的记录,但是,当我尝试从记录中获取值时,例如用户的电子邮件,则返回nil

var email: String = record.objectForKey("Email") as String

我也试过了:

record.valueForKey("Email")
record.valueForKeyPath("Email")

当我打印record.allKeys()时,我得到一个空数组,[],当我打印record.allTokens()时,我得到nil的回复

我是否没有正确地从记录中获取值,或者我是否必须在数据库中查询我希望使用记录ID获取的每个值?基于the documentation所说的内容:

  

CKRecord对象是用于获取和保存应用数据的键值对字典。

我认为我不必在数据库中查询我想要获取的每个值,并且从CKRecord获取值时,这些值会自动插入iCloud

1 个答案:

答案 0 :(得分:3)

当你遗漏这条线时:

queryOperation.desiredKeys = ["ID"]

查询将返回所有字段。

您没有收到ID字段可能是因为它是一个可以使用

访问的系统字段
var ID = record.recordID.recordName