Swift 如何在领域中进行嵌套查询
我有一个领域:Swift 如何在领域中进行嵌套查询,swift,realm,Swift,Realm,我有一个领域: class Train: RLMObject { dynamic var stationDeparture: Station? dynamic var trainId = 0 dynamic var route = RLMArray(objectClassName: Route.className()) override class func primaryKey() -> String { return "trainId"
class Train: RLMObject {
dynamic var stationDeparture: Station?
dynamic var trainId = 0
dynamic var route = RLMArray(objectClassName: Route.className())
override class func primaryKey() -> String {
return "trainId"
}
}
class Route: RLMObject {
dynamic var numberInRoute = 0
dynamic var station: Station?
var owners: [Train] {
return linkingObjectsOfClass("Train", forProperty: "Route") as! [Train]
}
}
class Station: RLMObject {
dynamic var code = 0
dynamic var name = ""
override class func primaryKey() -> String {
return "code"
}
dynamic var relatedStations = RLMArray(objectClassName: Station.className())
}
我试着在动态var车站的类Train:RLMObject
中获取车站和车站相关车站的所有列车部分:车站?
。首先,我从相关站点的代码中生成一个字符串,然后使用“IN”IN谓词进行查询
此函数有效,但它有效!:
func trainsForDepartureStation (station: Int) -> RLMResults? {
let stations = Station.objectsWhere("code == \(station)")
let related = stations.lastObject() as! Station
if related.relatedStations.count > 0 {
var st = ""
st += "{\(station)"
for id in 0...related.relatedStations.count-1 {
st += ", \(related.relatedStations[id].code)"
}
st += "}"
let trains = Train.objectsWhere("stationDeparture.code IN \(st)")
return trains
} else {
let trains = Train.objectsWhere("stationDeparture.code == \(station)")
return trains
}
}
但当我试着用同样的方法让列车在所有路线上的所有车站都运行时,它并没有起作用
let trains=Train.objectsWhere(“ANY route.station.relatedStations.code IN\(st)”)
错误在于:
'Invalid predicate', reason: 'Predicate with ANY modifier must compare a KeyPath with RLMArray with a value'
如何对此问题进行嵌套查询?
我不熟悉swift、objective-С和realm(您可能已经猜到了,您必须将该查询分解为多个查询。不过,首先,让我们重构
trainsForDepartureStation()
,以更好地了解它当前正在做什么:
func trainsForDepartureStation(station: Int) -> RLMResults? {
let stations = Station.objectsWhere("code == \(station)")
if let related = stations.lastObject() as? Station where related.relatedStations.count > 0 {
return Train.objectsWhere("stationDeparture IN %@", related.relatedStations)
} else {
return Train.objectsWhere("stationDeparture.code == \(station)")
}
}
好的,现在让我们将其更改为返回“所有列车路线上所有车站的列车”:
只有一个错误,这部分:
let allRelatedStations = Station.objectsWhere("relatedStations IN %@", related.relatedStations)
let allRelatedRoutes = Route.objectsWhere("station IN %@", allRelatedStations)
应替换为:
let allRelatedRoutes = Route.objectsWhere("station IN %@", related.relatedStations)
因为allRelatedStations没有获取相关站点,但再次仅获取父站点)这适用于仅具有相关站点的路由,如果父站点和相关站点都存在路由,如何连接此结果?将这两个查询与“或”组合以连接。
let allRelatedRoutes = Route.objectsWhere("station IN %@", related.relatedStations)