草庐IT

swift - 过滤器正在返回具有匹配子项的父项的所有子项

coder 2023-09-14 原文

我正在使用 Realm for 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"
    }
}

我正在尝试按邮政编码过滤掉位置,以便仅显示与给定邮政编码匹配的位置。我是这样做的

companies = realm.objects(Navigation.self).filter("key = 4").first!.companies.filter(predicate).sorted(byKeyPath: "key")

key = 4 位是因为过滤器应该只搜索一个特定类别下的公司。

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

如何将结果限制为匹配的位置?

最佳答案

How can I limit the results to be only locations with a match?

现在您返回一个 Results<Companies> ,但您似乎想要位置。我通过向 Companies 添加一些反向关系属性来完成我认为您正在寻找的东西和 Locations模型,然后在 Realm 中查询 Locations匹配zip == '12345' && ANY parentCompanies.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
    }
}

这打印:

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

    );
  }
)

关于swift - 过滤器正在返回具有匹配子项的父项的所有子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44190136/

有关swift - 过滤器正在返回具有匹配子项的父项的所有子项的更多相关文章

  1. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  2. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  3. ruby 正则表达式 - 如何替换字符串中匹配项的第 n 个实例 - 2

    在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg

  4. ruby - 匹配未转义的平衡定界符对 - 2

    如何匹配未被反斜杠转义的平衡定界符对(其本身未被反斜杠转义)(无需考虑嵌套)?例如对于反引号,我试过了,但是转义的反引号没有像转义那样工作。regex=/(?!$1:"how\\"#expected"how\\`are"上面的正则表达式不考虑由反斜杠转义并位于反引号前面的反斜杠,但我愿意考虑。StackOverflow如何做到这一点?这样做的目的并不复杂。我有文档文本,其中包括内联代码的反引号,就像StackOverflow一样,我想在HTML文件中显示它,内联代码用一些spanMaterial装饰。不会有嵌套,但转义反引号或转义反斜杠可能出现在任何地方。

  5. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  6. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

  7. ruby - 匹配大写字母并用后续字母填充,直到一定的字符串长度 - 2

    我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种

  8. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  9. ruby-on-rails - Rails 3.1 中具有相同形式的多个模型? - 2

    我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#

  10. ruby-on-rails - Rails 3,嵌套资源,没有路由匹配 [PUT] - 2

    我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle

随机推荐