我有一个很大的食谱列表,每个食谱里面都有一个配料列表。我想写一个查询,它将返回同时包含“蛋”和“黄油”的食谱列表。Here is a quick screenshot of the first few recipes in my CKRecord Type.在下面的示例代码中,它不返回任何结果,但也没有错误。
理想情况下,最好包含部分搜索,例如,“鸡蛋”仍然会返回一个以“鸡蛋”为原料的食谱。如果结果将具有同时包含“鸡蛋”和“黄油”的配料的配方优先排序,然后在配方列表的较低优先级上具有具有“鸡蛋”或“黄油”的配方,这将使.and子谓词查询具有比.or,子谓词查询更高的优先级。
我发现的其他关于NSCompoundPredicate的StackOverflow帖子在处理被查询的列表时没有帮助(比如在我的示例中,我在一个食谱列表中包含了一个配料列表)。
@objc func refresh(_ completion: @escaping (Error?) -> Void) {
let subdeptPredicate1 = NSPredicate(format: "ANY ingredients == %@", "egg")
let subdeptPredicate2 = NSPredicate(format: "ANY ingredients == %@", "butter")
let predicate = NSCompoundPredicate(type: .and,subpredicates: [subdeptPredicate1, subdeptPredicate2])
let sort = NSSortDescriptor(key: "recipe_id", ascending: false)
let query = CKQuery(recordType: "Recipe", predicate: predicate)
query.sortDescriptors = [sort]
AttachToMainThread(forQuery: query, completion)
}我可以用这行代码成功地返回成分中包含“黄油”或“鸡蛋”的食谱,但我希望优先考虑同时包含“鸡蛋”和“黄油”的食谱。
let searchText: [String] = ["butter","egg"]
let predicate = NSPredicate (format: "ANY ingredients IN %@",argumentArray: [searchText])非常感谢您的帮助!
更新
我发现,如果我只有一个子谓词,那么返回的每个食谱都只有“鸡蛋”作为第一种成分。
let subdeptPredicate1 = NSPredicate(format: "ANY ingredients == %@", "egg")
let predicate = NSCompoundPredicate(type: .and,subpredicates: [subdeptPredicate1])我确信这就是当我同时使用“鸡蛋”和“黄油”时返回零结果的原因,因为它们永远不会同时出现在第一种成分中。
发布于 2021-07-29 16:23:48
这是我的一个错误。我发现我解析csv文件的方式导致了这个问题。注意,第一个成分是单词开头唯一没有空格的成分。
这正是我想要的:
let searchTextA: [String] = ["egg"," egg"]
let subPred1 = NSPredicate (format: "ANY ingredients IN %@",argumentArray: [searchTextA])
let searchTextB: [String] = ["butter"," butter"]
let subPred2 = NSPredicate (format: "ANY ingredients IN %@",argumentArray: [searchTextB])
let predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [subPred1, subPred2])https://stackoverflow.com/questions/68555654
复制相似问题