2016-09-13 2 views
1

Я думаю, что это простое решение, но я придерживаюсь наилучшего подхода.Query Realm получить объект, который имеет особенно объект в списке

Моя база данных Realm производится с объектами POI и КАТЕГОРИЯ. Если POI может иметь один или несколько объектов из КАТЕГОРИИ

class POI: Object { 

    dynamic var id:String = "" 
    dynamic var name:String = "" 
    dynamic var visited:Bool = false; 

    let categories = List<CATEGORY>() 

    override static func primaryKey() -> String? 
    { 
     return "id"; 
    } 
} 

Позже мне нужно показать количество POI, которые имеют особую КАТЕГОРИИ и количество POI, которые имеют a КАТЕГОРИЯ с булевым посещением имеет значение true.

Что-то вроде этого:

func getAllVisitedPointsWithCategory(idCategory:String) -> Results<POI> { 

} 

func getAllPointsWithCategory(idCategory:String) -> Results<POI>{ 

} 

Любое предложение?

ответ

1

Это должно работать:

func getAllVisitedPointsWithCategory(idCategory:String) -> [POI] { 
    let containingPOI = getAllPointsWithCategory(idCategory) 

    return containingPOI.filter({ (poi) -> Bool in 
     return poi.visited 
    }) 
} 

func getAllPointsWithCategory(idCategory:String) -> [POI] { 
    let realm = try! Realm() 
    let containingPOI = realm.objects(POI).filter({ (poi) -> Bool in 
     return poi.categories.contains({ (cat) -> Bool in 
      return idCategory == cat.id 
     }) 
    }) 

    return containingPOI 
} 

Это в основном только запрашивая данные и фильтрации результата.

+0

идеально. благодаря – DaSilva

0

Это можно сделать более сжато и быстрее, используя механизм запросов Realm, а не фильтровать объекты по отдельности в Swift:

func getAllVisitedPointsWithCategory(idCategory:String) -> Results<POI> { 
    return getAllPointsWithCategory(idCategory).filter("visited = true") 
} 

func getAllPointsWithCategory(idCategory:String) -> Results<POI>{ 
    let realm = try! Realm() 
    return realm.objects(POI.self).filter("ANY categories.id = %@", idCategory) 
} 
Смежные вопросы