2017-05-05 94 views
0

在我使用Realm和Swift编写的游戏中,我试图做这种关系;领域 - 从孩子的角度获取所有儿童父母的列表

Locomotive -> Engine <- Player

  • 一个Player有许多Engines
  • 一个Locomotive有许多Engines

一点题外话,玩家永远只能拥有一台发动机(孩子)从一个机车(父)。

我想获得玩家拥有的所有孩子的所有父母的列表,使用Realm和NSPredicates。

也就是说,给定一个玩家实体;列出玩家拥有的所有引擎的所有父母,并按成本对父对象进行排序。由于该应用程序并不直接知道哪个玩家拥有哪个火车头,我想对玩家拥有的引擎进行查询,以找出他们拥有的火车头。

当我们通过它的子对象来获取这些信息时,我觉得它在火车头实体中有两个关系(一个用于所有引擎,一个用于所有玩家)有点矫枉过正。

具体来说,我想要一个玩家拥有的所有机车列表,按发动机实体的成本排序。 (我希望这是有道理的)

我的项目的相关代码如下;

// Locomotive entity 

public class Locomotive: Object { 
    var engines = List<Engine>() 
    private(set) dynamic var cost: Int = 0 
} 

// Engine entity 

public class Engine: Object { 
    private let parents = LinkingObjects(fromType: Locomotive.self, property: "engines") 
    private let owners = LinkingObjects(fromType: Player.self, property: "engines") 

} 

// Player entity 

public class Player: Object { 
    public let engines = List<Engine>() 
} 

    // Give me a list of all locomotives I own through the engines entity 
// and sort the locomotives by cost 

     let predicate = NSPredicate(format: "ANY engines.owners == %@", firstPlayer) 

     let allLocos = realm.objects(Player.self) 
      .filter(predicate) 

     print (allLocos.count) 

虽然这给了我所有的引擎,玩家拥有的列表,它并没有给我的机车名单(或按成本排序)

因此,我的查询是:

我如何从玩家拥有的所有孩子中获取所有父母(机车)的列表,并确保排序顺序是按成本计算的?

我希望我已经正确解释了我的问题,并欢迎任何可能由我的查询产生的帮助和帮助。

感谢

+0

顺便说一句,我能够从机车侧拿到名单,但之后我从玩家身边。 – zardon

回答

1

如果我没有看错,给予Player对象,要检索的Locomotive对象是Engine对象是Player对象的孩子的父母的列表。

你应该能够做一个对查找使用Player对象的engines属性Locomotive对象。它看起来是这样的(虽然无可否认,这是未经测试):

let player = // Get the player 
let locomotives = realm.objects(Locomotive.self).filter("ANY self IN %@", player.engines) 
+0

是的,这是我目前正在做它的方式(以及它的一个版本)。我试图看看我是否可以采用相反的方式 - 但事实证明这有点困难。而不管;我打算接受你的回答 – zardon

+0

酷!谢谢!等等,反过来呢?那么,就像采用一个'Locomotive'并计算可能与它共享'Engine'对象的任何'Player'对象? – TiM

+0

不理我,我迷惑自己。如查询中所述。我想'给一个球员实体;列出玩家拥有的所有引擎的所有父母,并按成本对父母对象进行排序。“我相信你的答案确实解决了这个问题 – zardon

相关问题