【问题标题】:Realm - How to get a list of on owners of an entity in a parent-child relationship?领域 - 如何获取父子关系中实体的所有者列表?
【发布时间】:2017-01-22 10:29:30
【问题描述】:

使用 Swift Realm,我想从父母的角度获得孩子的所有者。

简单来说,实体关系可以描述为:

Parent -< Child <- Player

使用给定的父级,我想获取玩家(所有者)的列表。

当我尝试查询时,我认为我的查询是错误的;

// Cut-down summary of Realm objects and relationships
public class Parent: Object {
  var children = List<Child>()
}
public class Child: Object {
  private let parents = LinkingObjects(fromType: Parent.self, property: "children")
  private let owners = LinkingObjects(fromType: Player.self, property: "children")
  var parent:Parent? {
      return self.parents.first
  }
  var owner: Player? {
      return self.owners.first
  }
}
public class Player : Object {
  public let children = List<Child>()
}



let realm = try! Realm()
self.createPlayers(amount: 5)
let playerList = realm.objects(EYPlayer.self)
XCTAssert(playerList.count == 5)


// In my tests:
let firstParent = realm.objects(Parent.self).first
let firstChild = firstParent?.children.first
let firstPlayer = realm.objects(Player.self).first

// Assign the first player with the first child
try! realm.write {
    firstPlayer?.children.append(firstChild!)
}

// give me a list of owners for a given parent
let owners = realm.objects(Parent.self).filter("ANY children.owners.@count > 0")
print (owners)

// Test fails; it says there are 0 results
XCTAssert(owners.count == 1, "Expected: 1, Found: \(owners.count)")

此测试失败:

XCTAssert(owners.count == 1, "Expected: 1, Found: \(owners.count)")

我希望有 1 个所有者。

但是,我得到了 0 个所有者。

我做错了什么?

如何使用 NSPredicates 和 Realm 获取给定孩子的所有者列表?

非常感谢

编辑:发现我没有添加任何玩家;添加玩家的总结版本如上所示

【问题讨论】:

    标签: swift subquery realm nspredicate


    【解决方案1】:

    我现在已经解决了这个问题。

    1. 没有可将孩子附加到的玩家数据;我已经在我的 xctests 中修复了这个问题
    2. 在我这样做之后,对我的测试进行了一些调整,查询似乎正在工作,并在我的记录器输出中验证了它。

          let firstParent = realm.objects(Parent.self).first
          let firstPlayer = realm.objects(Player.self).first
          let firstChild = firstParent?.children.first
      
          XCTAssert(firstChild?.parent == firstParent)
      
          try! realm.write {
              firstPlayer!.children.append(firstChild!)
          }
      
          let listOfChildren = realm.objects(Parent.self).filter("ANY children.owners.@count > 0")
          XCTAssert(listOfChildren.count == 1)
          XCTAssert(firstPlayer?.children.count == 1)
      
          for child in listOfChildren {
              for (index, eng) in child.children.enumerated() {
                  if (index == 0) {
                      XCTAssert(eng.owner != nil)
                  }
                  XCTAssert(child.parent == loco)
              }
          }
      

    测试通过了,通过一些控制台日志,我能够验证我的期望。

    问题已解决。

    关闭。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      相关资源
      最近更新 更多