如何使用Swift快速过滤子列表对象?

问题描述

我创建了两个Realm Object。我想过滤子列表对象,但无法过滤。

我的第一个对象如下

class OrgDetails: Object,Codable {
    @objc dynamic var orgId: Int = 0
     //some other property
    let orgMembers = List<OrgMembers>()
    @objc dynamic var isRemoved: Bool = false
    //other code
}

我的第二个对象

class OrgMembers: Object,Codable {
    @objc dynamic var orgId: Int = 0
    @objc dynamic var orgMemberId: Int = 0
    @objc dynamic var isDeleted: Bool = false
    //other property and code
}

在这里我尝试下面的查询来过滤结果集。我只想选择未删除 orgMembers及其orgDetails。

let orgs = RealmManager.shared.read(condition: "isRemoved = false",object: OrgDetails.self)?.filter("orgMembers.isDeleted = false")

我也尝试过

self.corporates = RealmManager.shared.read(condition: "isRemoved == false and orgMembers.isDeleted == false",object: OrgDetails.self)?.toArray(type: OrgDetails.self)

但是两个查询都给出了错误

'Invalid predicate',reason: 'Key paths that include an array property must use aggregate operations'

如何使用过滤器获取记录?还有其他方法可以达到上述效果吗?

解决方法

如果我正确理解了您的问题,则您正在尝试: 1-过滤将isRemove设置为false的OrgDetails 2-对于在1 /中获得的数组的每个元素,您想过滤掉组织成员,只保留那些未被删除的成员。

这是我要怎么做:

var orgs = RealmManager.shared.read(condition: "isRemoved = false",object: OrgDetails.self)
orgs.forEach {
   $0.orgMembers = Array($0.orgMembers.filter({ !$0.isDeleted }))
}
,

您的问题不清楚。

如果您想要一个未删除的组织且删除的成员为零的组织列表,这将为您提供想要的:

let orgs = RealmManager.shared.read(condition: "isRemoved == false",object: OrgDetails.self)?
    .filter("SUBQUERY(orgMembers,$orgMember,$orgMember.isDeleted == true).@count == 0")

如果您想要一个尚未删除的组织列表,省略其已删除的成员,则无法通过查询来做到这一点。我的建议是用两个列表定义您的OrgDetails模型。一个列表的成员尚未删除,另一列表的成员已删除。

class OrgDetails: Object,Codable {
    @objc dynamic var orgId: Int = 0
    let orgMembers = List<OrgMembers>()
    let orgMembersDeleted = List<OrgMembers>()
    @objc dynamic var isRemoved: Bool = false
}
,

让我重申一下这个问题:

基于问题中的两个Realm对象,您想返回所有 OrsDetails其中isRemoved = false并且列表中的任何orgMembers都有 一个isRemoved属性= false。

换句话说,如果main属性上的isRemoved为false,并且列表中的任何orgMember都具有isRemoved = false。

如果这是问题,那么答案是一个问题

let result = realm.objects(OrgDetails.self).filter("isRemoved == false AND (ANY orgMembers.isDeleted == false)")

这将返回所有isRemoved为false且其List属性中的任何OrgMembers具有isDeleted = false的OrgDetails对象。