如何获取当前用户创建的所有CloudKit记录?

Mat*_*Mac 7 ios swift cloudkit ckquery ckrecord

假设我有一个'物种'记录类型,其中包含由许多用户创建的公共记录.目前,我的查询检索"物种"的所有记录:

private func fetchSpecies() {
    // Fetch Public Database
    let publicDatabase = CKContainer.defaultContainer().publicCloudDatabase

    // Initialize Query
    let query = CKQuery(recordType: "Species", predicate: NSPredicate(format: "TRUEPREDICATE"))

    // Configure Query
    query.sortDescriptors = [NSSortDescriptor(key: "latinName", ascending: true)]

    // Perform Query
    publicDatabase.performQuery(query, inZoneWithID: nil) { (records, error) -> Void in
    dispatch_async(dispatch_get_main_queue(), { () -> Void in
        // Process Response on Main Thread
        self.processResponseForQuery(records, error: error)
        })
    }
}
Run Code Online (Sandbox Code Playgroud)

如何只获取当前用户创建的记录(如设备所有者)?

谢谢!

Mat*_*Mac 7

我还在Apple开发者论坛上发帖,我获得了一个很好的解决方案:

要仅获取特定用户记录,您需要创建指向该用户ID(recordID)的CKReference,然后在其上使用谓词.它看起来像这样:

首先获取用户记录ID

yourContainer.fetchUserRecordIDWithCompletionHandler { (userID, error) -> Void in  
    if let userID = userID {  
        // here's your userID (recordID) to play with  
    }  
}
Run Code Online (Sandbox Code Playgroud)

然后构造谓词:

let reference = CKReference(recordID: userID, action: .None)  
let predicate = NSPredicate(format: "creatorUserRecordID == %@", reference)  
let query = CKQuery(recordType: "Species", predicate: predicate) 
Run Code Online (Sandbox Code Playgroud)

然后正常使用查询.

快乐的取材!


All*_*len 3

每个人CKRecord都有creatorUserRecordID财产;因此,您可以尝试先获得所有者的支持userRecordID。然后,将其放入NSPredicate.

let container: CKContainer = CKContainer.defaultContainer()
let completionHandler: (CKRecordID?, NSError?) -> Void = { (userRecordID: CKRecordID?, error: NSError?) in
    if let userRecordID = userRecordID {
        let predicate = NSPredicate(format: "creatorUserRecordID == %@", userRecordID)
        let query = CKQuery(recordType: "Species", predicate: predicate)
        query.sortDescriptors = [NSSortDescriptor(key: "latinName", ascending: true)]
        container.publicCloudDatabase.performQuery(query, inZoneWithID: nil) { (records, error) -> Void in

        }
    }
}
//// Returns the user record ID associated with the current user.
container.fetchUserRecordIDWithCompletionHandler(completionHandler)
Run Code Online (Sandbox Code Playgroud)