我想使用iCloud公共数据库为我的用户提供特定RecordType“项目”的项目:
Item: {
"name": String,
"image": Asset // this is a PNG or JPEG
}
“我的视图”包含一个文本字段,用户可以在其中键入searchText。每当searchText更改时,我都想查询iCloud公共数据库中名称包含此searchText的项目。代码如下所示:
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")
})
}
}
问题在于,运算符contain只适用于列表,而不适用于像“name”属性这样的字符串。有运算符BEGINSWITCH和**=**,但它们只返回那些名称以searchText开头或等于searchText的项。例如,如果用户键入“anan”,我想得到一个项目的名称为“香蕉”被退回以及。有没有办法做到这一点,或者我必须诉诸下载每一个单一的项目在启动的应用程序和过滤他们在本地的设备?
备注
已经有一个类似的问题:How do I perform text search on Cloudkit records?建议的答案是使用
NSPredicate(format: @"self contains %@", searchText)
对于Swift,必须删除@符号才能使查询有效。但是,这只会查询与searchText完全匹配的属性记录。如果只有部分名称与searchText匹配,则此操作无效。
1条答案
按热度按时间kwvwclae1#
Apple's documentation明确指出:
有一个例外,即CONTAINS运算符仅用于测试列表成员资格。例外情况是将其与自密钥路径一起用于执行全文搜索。自密钥路径会导致服务器在基于字符串的可搜索字段中查找指定的标记字符串。例如, predicate 字符串@“self contains 'blue'"在标记为包含在全文搜索中的所有字段中搜索单词blue。不能使用self键路径在类型不是字符串的字段中搜索。
这个问题可能会帮助您进行全文检索:How to do a CloudKit full text search that includes a token search