如何从 CloudKit 查询和获取数据?

Posted

技术标签:

【中文标题】如何从 CloudKit 查询和获取数据?【英文标题】:How do I query and obtain data from CloudKit? 【发布时间】:2015-12-05 01:33:50 【问题描述】:

我对 Swift 还很陌生,本周刚开始为一个 ios 应用项目学习 CloudKit。

数据库正在运行,我可以在数据库中添加记录和查找记录。

我在向 CloudKit 发送查询并访问与查询相关的数据时遇到了问题。

CloudKit 数据具有唯一标识符,因此搜索是针对这些标识符之一(因此查询应该只返回一条记录)。然后我试图从该记录中获取三条信息 - “UPC”、“foodName”和“Ingredients”(所有字符串)

这是执行查询并尝试获取数据的代码部分。

let publicDatabase = CKContainer.defaultContainer().publicCloudDatabase

let predicate = NSPredicate(format: "UPC = %@", subStr)

let query = CKQuery(recordType: "Food", predicate: predicate)

publicDatabase.performQuery(query, inZoneWithID: nil,
                    completionHandler: (results, error in

       if (error != nil) 
           dispatch_async(dispatch_get_main_queue()) 
                     print("CloudKit Error")
                            
                         else 
        if results!.count > 0 

            var record = results as! CKRecord

            dispatch_async(dispatch_get_main_queue()) 

            print("UPC Found")
            let cloudUPC = record.objectForKey("UPC") as! CKAsset
            print("UPC from CloudKit \(cloudUPC)")

                
             else 
               dispatch_async(dispatch_get_main_queue()) 
                                    print("UPC Not Found")
                                
                            
                        
                    ))

此时发生崩溃

 var record = results as! CKRecord

并返回“EXC_Breakpoint(code = 1, subcode - 0x10047b7c)

关于如何解决这个问题有什么建议吗?

谢谢

【问题讨论】:

resultsCKRecord 的数组。您不能简单地将数组转换为CKRecord。循环遍历数组。 @rmaddy 这应该是一个答案而不是评论...... 【参考方案1】:

感谢rmaddy的建议。

这就是我修复代码的方式

let publicDatabase = CKContainer.defaultContainer().publicCloudDatabase

let predicate = NSPredicate(format: "UPC = %@", subStr)

let query = CKQuery(recordType: "Food", predicate: predicate)

publicDatabase.performQuery(query, inZoneWithID: nil,
                completionHandler: (results, error in

                    if (error != nil) 
                        dispatch_async(dispatch_get_main_queue()) 
                            print("Cloud Error")
                        
                     else 
                        if results!.count > 0 


          dispatch_async(dispatch_get_main_queue()) 


         for entry in results! 
         let cloudUPC = entry["UPC"] as? String
         print("UPC from CloudKit \(cloudUPC)")

         let cloudFoodName = entry["foodName"] as? String
         print("Name from CloudKit \(cloudFoodName)")

         let cloudIngredients = entry["Ingredients"] as? String
         print("Ingredients from CloudKit \(cloudIngredients)")

          
         else 
           dispatch_async(dispatch_get_main_queue()) 
                                print("UPC Not Found")
                            
                        
                    
                ))

【讨论】:

【参考方案2】:

您需要首先在记录中的项目上编写 for 循环,然后打印每个 UPC 像这样:

for item in record 
print(item["UPC"]
print(item["foodName"]

【讨论】:

以上是关于如何从 CloudKit 查询和获取数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Cloudkit 快速从 iCloud 获取当前用户信息

从 CloudKit 获取包括 CKReference 的数据

CloudKit 光标错误和无法返回所有行 - 获取记录时遇到错误

无法从 CloudKit 通知信息和用户信息结构中获取 CKRecord.ID

CloudKit 获取用户 iTunes 备份

我如何通过其记录名称查询 CloudKit 以获取特定记录?