【问题标题】:Query iCloud public database to find records with properties that contain the search string查询 iCloud 公共数据库以查找其属性包含搜索字符串的记录
【发布时间】: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


    【解决方案1】:

    Apple's documentation明确指出:

    除了一个例外,CONTAINS 运算符仅用于测试列表成员.例外情况是当您使用它与自键路径一起执行全文搜索时。自密钥路径使服务器在可搜索的基于字符串的字段中查找指定的令牌字符串。例如,@"self contains 'blue'" 的谓词字符串在您标记为包含在全文搜索中的所有字段中搜索单词 blue。您不能使用自键路径在非字符串类型的字段中进行搜索。

    可能这个问题会帮助你进行全文搜索:How to do a CloudKit full text search that includes a token search

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-20
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 2016-04-14
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      相关资源
      最近更新 更多