一对多关系下删除仅关联指定group_id的非目标用户的查询优化
解决Core Data中仅删除单关联指定Group的用户问题
你当前的查询会误删关联多个Group的用户,核心原因是ANY group.id = %@只判断了用户存在关联目标Group的情况,但没限制用户只关联这一个Group。要实现需求,需要同时满足三个条件:
- 用户ID不在指定保留数组内
- 用户仅关联一个Group
- 这个唯一的Group就是目标Group
修改后的代码如下:
let ids = users.map({ $0.uid }) let predicate = NSPredicate(format: "NOT (id in %@) && group.@count == 1 && ANY group.id = %@", ids, groupId) persistenceManager.delete(predicate, User.self)
逻辑说明:
NOT (id in %@):排除需要保留的指定用户group.@count == 1:确保用户只关联了一个GroupANY group.id = %@:验证这个唯一关联的Group就是目标Group
如果要更严谨地确保用户关联的所有Group都是目标Group(比如极端情况用户关联多个相同ID的Group,业务上应避免这类情况),也可以用SUBQUERY写法:
let predicate = NSPredicate(format: "NOT (id in %@) && SUBQUERY(group, $g, $g.id != %@).@count == 0", ids, groupId)
这个写法的逻辑是:用户关联的Group中,不存在ID不等于目标Group的项,也就是所有关联的Group都是目标Group。结合你的需求,两种写法都能达到效果,第一种更直观贴合“仅关联单个Group”的场景。
内容的提问来源于stack exchange,提问作者j.doe
相关产品推荐
相关产品推荐

