在 NSPredicate 中使用 if then 逻辑来获取请求

问题描述 投票:0回答:1

我当前有一个正在尝试查询的实体列表。它有两个属性,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)
swift core-data
1个回答
0
投票

以下是为您的查询使用正确逻辑的代码片段:

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 不匹配,要么如果匹配,则值应该不同。

© www.soinside.com 2019 - 2024. All rights reserved.