【发布时间】:2023-01-26 01:26:40
【问题描述】:
我想使用 iCloud 公共数据库为我的用户提供特定记录类型“项目”的项目:
Item: {
"name": String,
"image": Asset // this is a PNG or JPEG
}
我的视图包含一个文本字段,用户可以在其中键入搜索文本。每当 searchText 发生变化时,我想在 iCloud 公共数据库中查询名称包含此 searchtText 的项目。 代码看起来像这样:
import SwiftUI
import CoreData
import Foundation
import CloudKit
struct ContentView: View {
@State var searchText: String = ""
func fetchCloudData() {
let container = CKContainer.default()
let publicDB = container.publicCloudDatabase
let predicate = NSPredicate(value: true)
let predicate = NSPredicate(format: "name contains %@", searchText)
publicDB.perform(query, inZoneWith: nil) { (records, error) in
guard error == nil else {
print("Error fetching records: \(error!)")
return
}
if let records = records {
records.forEach({ (record) in
print(record)
})
}
}
}
var body: some View {
TextField("Type in name...", text: $searchText)
Button(action: {
fetchCloudData()
}, label: {
Text("Fetch all items")
})
}
}
问题是运营商包含只适用于列表而不适用于像“name”属性这样的字符串。有运营商开始于和=,但它们只返回名称以 searchText 开头或等于 searchText 的那些项目。例如,如果用户输入“anan”,我也想返回一个名为“Banana”的项目。有没有办法做到这一点,或者我是否必须诉诸于在应用程序启动时下载每个项目并在设备上本地过滤它们?
评论
已经有类似问题了:How do I perform text search on Cloudkit records? 建议的答案是使用
NSPredicate(format: @"self contains %@", searchText)
对于 Swift,必须删除 @ 符号才能使查询正常工作。但是,这只会查询与 searchText 完全匹配的属性的记录。如果只有部分名称与 searchText 匹配,这将不起作用。
【问题讨论】:
标签: swift xcode swiftui icloud cloudkit