Parse-Swift 校验多列(复合/OR语句)

Parse-Swift Check multiple columns (Compound / OR statement)

我有一个 table,我的数据库中有三列可以包含一个字符串,如果 ANY,我需要检查所有这三列和 return 那一行数据 这些列中有我要找的东西。

例如,我要查找的字符串可能出现在一行的第一列 (firstArtist) 中,但可能出现在第二列 (secondArtist) 中,也可能出现在第三列 (thirdArtist) 中。

我使用的是 Parse-Swift 而不是 Parse。

壁纸是我的模型class。

我试过这样的事情:

var testString = "example"

let query = Wallpaper.query()
            .where(Wallpaper.CodingKeys.firstArtist.rawValue == testString)
            .where(Wallpaper.CodingKeys.secondArtist.rawValue == testString)
            .where(Wallpaper.CodingKeys.thirdArtist.rawValue == testString)

但是没有从数据库中检索到任何内容,我认为这是因为它没有在第一个 where 语句中找到任何内容,所以它不包括那些可能包含字符串的结果。

以下作品:

let query = Wallpaper.query()

       query.findAll { result in
            switch result {
            case let .success(wallpapers):
                var test: [Wallpaper] = []
                for item in wallpapers {
                    if item.artists.contains(testString) {
                        test.append(item)
                    }
                }
                completion(.success(test))
            case let .failure(error):
                completion(.failure(error))
            }
        }

但是循环遍历结果并手动过滤它们会导致我的应用程序需要十多秒的时间来加载结果,因为我正在抓取所有不理想的东西。

如何在 Parse-Swift 中执行与 OR 语句/复合语句等效的操作?我查看了文档,但找不到相关示例。

我找到了这个存储库 Github Parse-Swift Playground 其中包含来自 Parse-swift 开发者本身的示例,但什么也没有。

您在查询中创建的语句本质上是一个 AND 语句,并且要求键位于所有 3 列中。 API documentation 表明有一个 or 查询约束可用。我建议查看 API 文档以查看所有可用的功能,因为 Playgrounds 并不打算实现 Parse-Swift.

的所有功能

您可以通过以下方式实现您的目标:

let query1 = Wallpaper.query(Wallpaper.CodingKeys.firstArtist.rawValue == testString)

let query2 = Wallpaper.query(Wallpaper.CodingKeys.secondArtist.rawValue == testString)

let query3 = Wallpaper.query(Wallpaper.CodingKeys.thirdArtist.rawValue == testString)            

let subQueries = [query1, query2, query3]
let query = Wallpaper.query(or(queries: subQueries))

// Using async/await, but completion block will be similar to the code you provided
do {
  let wallpapers = try await query.findAll()
  print(wallpapers)
} catch {
  //Handle error
}