Swift 筛选器正在返回具有匹配子级的父级的所有子级

Swift 筛选器正在返回具有匹配子级的父级的所有子级,swift,realm,filtering,nspredicate,Swift,Realm,Filtering,Nspredicate,我使用的是Swift领域,我的结构如下: class Navigation: Object { dynamic var key = 0 dynamic var title: String? let companies = List<Companies>() override static func primaryKey() -> String? { return "key" } } class Companies:

我使用的是Swift领域,我的结构如下:

class Navigation: Object {

    dynamic var key = 0
    dynamic var title: String?
    let companies = List<Companies>()

    override static func primaryKey() -> String? {
        return "key"
    }
}

class Companies: Object {

    dynamic var key = 0
    dynamic var name: String?
    let locations = List<Locations>()

    override static func primaryKey() -> String? {
        return "key"
    }
}

class Locations: Object {

    dynamic var key = 0
    ...
    dynamic var zip: String?
    let contacts = List<Contacts>()

    override static func primaryKey() -> String? {
        return "key"
    }
}

class Contacts: Object {

    dynamic var key = 0
    dynamic var firstName: String?
    dynamic var lastName: String?
    ...

    override static func primaryKey() -> String? {
        return "key"
    }
}
key=4
位是因为过滤器只应在一个特定类别下的公司中搜索

我遇到的问题是,它返回具有匹配位置的公司的所有位置。因此,如果我要查找的邮政编码是12345,并且companyA有一个匹配的位置,则返回companyA下的所有位置,即使它们不匹配

我如何将结果限制为只有匹配的位置

我如何将结果限制为只有匹配的位置

现在,您正在返回一个
结果
,但似乎您需要位置。通过向
公司
位置
模型添加一些反向关系属性,我完成了我认为您要查找的内容,然后查询了
位置
匹配的
zip=='12345'&任意parentcompanys.parentNavigation.key==4

下面是一个示例应用程序,演示了这一点:

import UIKit
import RealmSwift

class Navigation: Object {

    dynamic var key = 0
    dynamic var title: String?
    let companies = List<Companies>()

    override static func primaryKey() -> String? {
        return "key"
    }
}

class Companies: Object {

    dynamic var key = 0
    dynamic var name: String?
    let locations = List<Locations>()
    let parentNavigation = LinkingObjects(fromType: Navigation.self, property: "companies")

    override static func primaryKey() -> String? {
        return "key"
    }
}

class Locations: Object {

    dynamic var key = 0
    // ...
    dynamic var zip: String?
    let contacts = List<Contacts>()
    let parentCompanies = LinkingObjects(fromType: Companies.self, property: "locations")

    override static func primaryKey() -> String? {
        return "key"
    }
}

class Contacts: Object {

    dynamic var key = 0
    dynamic var firstName: String?
    dynamic var lastName: String?
    // ...

    override static func primaryKey() -> String? {
        return "key"
    }
}

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        _ = try? FileManager.default.removeItem(at: Realm.Configuration.defaultConfiguration.fileURL!)
        let realm = try! Realm()

        // Objects Matching Query
        try! realm.write {
            // Locations
            let locations = Locations()
            locations.zip = "12345"

            // Companies
            let companies = Companies()
            companies.name = "Companies A"
            companies.locations.append(locations)

            // Nav
            let nav = Navigation()
            nav.key = 4
            nav.companies.append(companies)

            // Add to Realm
            realm.add(nav)
        }

        let locationsIn12345AndNavigationKey4 = realm.objects(Locations.self)
            .filter("zip == '12345' && ANY parentCompanies.parentNavigation.key == 4")
        print(locationsIn12345AndNavigationKey4)

        return true
    }
}
导入UIKit
导入RealmSwift
类导航:对象{
动态变量键=0
动态变量标题:字符串?
让公司=列表()
重写静态func primaryKey()->字符串{
返回“键”
}
}
类别公司:对象{
动态变量键=0
动态变量名:字符串?
让位置=列表()
让parentNavigation=LinkingObjects(fromType:Navigation.self,属性:“companys”)
重写静态func primaryKey()->字符串{
返回“键”
}
}
类位置:对象{
动态变量键=0
// ...
动态var-zip:String?
让联系人=列表()
让parentcompanys=LinkingObjects(fromType:companys.self,property:“locations”)
重写静态func primaryKey()->字符串{
返回“键”
}
}
类联系人:对象{
动态变量键=0
动态变量名:字符串?
动态变量lastName:String?
// ...
重写静态func primaryKey()->字符串{
返回“键”
}
}
@UIApplicationMain
类AppDelegate:UIResponder、UIApplicationLegate{
变量窗口:UIWindow?
func应用程序(application:UIApplication,didFinishLaunchingWithOptions launchOptions:[UIApplicationLaunchOptions:[UIApplicationLaunchOptions:任何]?)->Bool{
_=try?FileManager.default.removietem(位于:Realm.Configuration.defaultConfiguration.fileURL!)
让realm=try!realm()
//对象匹配查询
试试看!写吧{
//地点
让位置=位置()
locations.zip=“12345”
//公司
让公司=公司()
companys.name=“公司A”
公司.地点.附加(地点)
//导航
设nav=Navigation()
导航键=4
资产净值公司追加(公司)
//添加到领域
realm.add(导航)
}
让Locationsin12345和NavigationKey4=realm.objects(Locations.self)
.filter(“zip='12345'和&anyparentcompanys.parentNavigation.key==4”)
打印(位置SIN12345和导航键4)
返回真值
}
}
这张照片是:

Results<Locations> (
  [0] Locations {
    key = 0;
    zip = 12345;
    contacts = RLMArray <0x6000000f2100> (

    );
  }
)
结果(
[0]位置{
键=0;
zip=12345;
联系人=玛丽(
);
}
)

我可以使用它,但理想情况下,我希望它也有“拥有”这些位置的公司,这样用户就知道他们在找什么公司。有很多地方的名称类似,比如“主办公室”。简单:
locationsin12345和navigationkey4.flatMap{$0.parentcompanys}
你能让这个代码更友好吗?这应该是进入过滤器的字符串吗?这些是实际的函数调用吗?我想这也必须通过反向关系来完成?我不明白这些问题中的任何一个。请您重新措辞好吗?您的评论,
Locationsin12345和NavigationKey4.flatMap{$0.ParentCompanys}
,这应该作为字符串进入
filter()
函数,还是作为代码?如果是,我应该将其附加到什么?
Results<Locations> (
  [0] Locations {
    key = 0;
    zip = 12345;
    contacts = RLMArray <0x6000000f2100> (

    );
  }
)