2015-04-24 2 views
0

У меня есть область:Как сделать вложенные запросы в 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 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()) 
} 

я пытался получить все поезда на станцию ​​и смежные станции станции в class Train: RLMObject для dynamic var stationDeparture: Station?. Сначала я создал строку из кодов связанных станций, а затем сделал запрос с использованием «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' 

Как сделать вложенный запрос для этой проблемы? Я новичок в быстрой, Objective-с и области (

ответ

0

Вам придется сломать этот запрос на несколько запросов, как вы уже догадались. Во-первых, хотя, давайте просто реорганизовать 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)") 
    } 
} 

Итак, теперь давайте изменим это, чтобы вернуть «поезд с все станциями во всех маршрутах поезда»:

func trainsForDepartureStation(station: Int) -> RLMResults? { 
    let stations = Station.objectsWhere("code == \(station)") 
    if let related = stations.lastObject() as? Station where related.relatedStations.count > 0 { 
    let allRelatedStations = Station.objectsWhere("relatedStations IN %@", related.relatedStations) 
    let allRelatedRoutes = Route.objectsWhere("station IN %@", allRelatedStations) 
    return Train.objectsWhere("ANY route IN %@", allRelatedRoutes) 
    } else { 
    let allRelatedRoutes = Route.objectsWhere("station == %@", stations.lastObject() as! Station) 
    return Train.objectsWhere("ANY route IN %@", allRelatedRoutes) 
    } 
} 
+0

эта работа для маршрутов только связанных станций, как сцепить это приводит, если маршруты существуют как для материнской станции, так и для связанных станций? –

+0

объединить эти два запроса с «OR» для объединения. – jpsim

0

Только 1 ошибка, эта часть:

let allRelatedStations = Station.objectsWhere("relatedStations IN %@", related.relatedStations) 
    let allRelatedRoutes = Route.objectsWhere("station IN %@", allRelatedStations) 

следует заменить:

let allRelatedRoutes = Route.objectsWhere("station IN %@", related.relatedStations) 

потому что allRelatedStations не принести связанной станции, а только родительские станции снова)

Смежные вопросы