我当前有一个正在尝试查询的实体列表。它有两个属性,id 和 value。我想执行一个查询,它首先检查 id 是否不匹配 (
NSPredicate(format: "id != %@", id)
)。但我还想检查 id 是否匹配,然后确保值不匹配 (NSPredicate(format: "media.mediaType != %@", mediaType.coredataID as NSNumber)
)。因此,查询尝试获取所有不具有任何值的匹配 id 的实体,或者如果它们是匹配 id,则不是匹配值。
使用复合谓词会导致它无法获取我不想要的匹配 id 或值。我不确定除了在查询 id 后过滤掉匹配值之外是否还有其他方法。
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Entity")
var predicates: [NSPredicate] = []
let idPredicate = NSPredicate(format: "id != %@", id)
let valuePredicate = NSPredicate(format: "value != %@", value)
predicates.append(idPredicate)
predicates.append(valuePredicate)
request.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: predicates)
以下是为您的查询使用正确逻辑的代码片段:
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Entity")
let idPredicate = NSPredicate(format: "id != %@", id)
let valuePredicate = NSPredicate(format: "(id == %@) AND (value != %@)", id, value)
let finalPredicate = NSCompoundPredicate(orPredicateWithSubpredicates: [idPredicate, valuePredicate])
request.predicate = finalPredicate
在此代码中,
idPredicate
保持不变,以过滤掉 ID 不匹配的实体。 valuePredicate
是用复合条件构造的,检查 ID 是否匹配以及该值是否不是您要查找的值。最后,finalPredicate
将这两个谓词与 OR 条件组合起来,以实现所需的逻辑:要么 ID 不匹配,要么如果匹配,则值应该不同。