Parse-Swift 检查多列(复合 / OR 语句)

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

提问人:Rlaw 提问时间:2/25/2022 更新时间:2/26/2022 访问量:99

问:

我有一个表,我的数据库中有三列可以包含一个字符串,我需要检查所有三列,如果这些列中的任何一列具有我正在寻找的内容,我需要返回该行数据。

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

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

墙纸是我的模型类。

我试过这样的事情:

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 开发人员本身的示例,但什么都没有。

Swift 数据库 解析 平台 back4app

评论


答:

1赞 CoreyB 2/25/2022 #1

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

您可以通过执行以下操作来实现您的目标:

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
}