CloudKit如何查询和获取数据?
How do I query and obtain data from CloudKit?
我是 Swift 的新手,本周才开始学习 CloudKit 的 iOS 应用程序项目。
数据库正常,我可以在数据库中添加记录和查找记录。
我 运行 向 CloudKit 发送查询并访问与查询相关的数据时遇到问题。
CloudKit 数据具有唯一标识符,因此搜索是针对这些标识符之一(因此查询应该只 return 一条记录)。然后我试图从该记录中获取三条信息 - "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
and returns "EXC_Breakpoint(code = 1, subcode - 0x10047b7c)
关于如何解决这个问题有什么建议吗?
谢谢
谢谢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")
}
}
}
}))
您需要先对记录中的项目编写 for 循环,然后打印每个 UPC
像那样:
for item in record {
print(item["UPC"]
print(item["foodName"]
}
我是 Swift 的新手,本周才开始学习 CloudKit 的 iOS 应用程序项目。
数据库正常,我可以在数据库中添加记录和查找记录。
我 运行 向 CloudKit 发送查询并访问与查询相关的数据时遇到问题。
CloudKit 数据具有唯一标识符,因此搜索是针对这些标识符之一(因此查询应该只 return 一条记录)。然后我试图从该记录中获取三条信息 - "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
and returns "EXC_Breakpoint(code = 1, subcode - 0x10047b7c)
关于如何解决这个问题有什么建议吗?
谢谢
谢谢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")
}
}
}
}))
您需要先对记录中的项目编写 for 循环,然后打印每个 UPC 像那样:
for item in record {
print(item["UPC"]
print(item["foodName"]
}