2017-05-25 2 views
2

J'utilise Royaume pour Swift et j'ai une structure comme suit:filtre retourne tous les enfants pour parent avec enfant correspondant à

class Navigation: Object { 

    dynamic var key = 0 
    dynamic var title: String? 
    let companies = List<Companies>() 

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

class Companies: Object { 

    dynamic var key = 0 
    dynamic var name: String? 
    let locations = List<Locations>() 

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

class Locations: Object { 

    dynamic var key = 0 
    ... 
    dynamic var zip: String? 
    let contacts = List<Contacts>() 

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

class Contacts: Object { 

    dynamic var key = 0 
    dynamic var firstName: String? 
    dynamic var lastName: String? 
    ... 

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

J'essaie de filtrer les endroits par code postal, de sorte que seul les emplacements correspondant au code postal donné sont affichés. Je fais ça comme ça

companies = realm.objects(Navigation.self).filter("key = 4").first!.companies.filter(predicate).sorted(byKeyPath: "key") 

Le bit key = 4 est parce que le filtre n'est censé rechercher dans les entreprises dans une catégorie spécifique.

Le problème que je vais avoir est qu'il retourne tous les emplacements pour une entreprise qui a un emplacement correspondant. Donc, si mon code postal à trouver est 12345, et que companyA a un emplacement correspondant, tous les emplacements sous companyA sont renvoyés, même s'ils ne correspondent pas.

Comment puis-je limiter les résultats à seulement emplacements avec une correspondance?

Répondre

3

Comment puis-je limiter les résultats à seulement emplacements avec une correspondance?

En ce moment, vous renvoyez un Results<Companies>, mais il semble que vous vouliez des emplacements. J'accompli ce que je pense que vous êtes à la recherche en ajoutant des propriétés de relation inverse aux modèles Companies et Locations, puis interrogé le royaume pour Locations correspondant zip == '12345' && ANY parentCompanies.parentNavigation.key == 4.

Voici un exemple d'application qui illustre ceci:

import UIKit 
import RealmSwift 

class Navigation: Object { 

    dynamic var key = 0 
    dynamic var title: String? 
    let companies = List<Companies>() 

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

class Companies: Object { 

    dynamic var key = 0 
    dynamic var name: String? 
    let locations = List<Locations>() 
    let parentNavigation = LinkingObjects(fromType: Navigation.self, property: "companies") 

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

class Locations: Object { 

    dynamic var key = 0 
    // ... 
    dynamic var zip: String? 
    let contacts = List<Contacts>() 
    let parentCompanies = LinkingObjects(fromType: Companies.self, property: "locations") 

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

class Contacts: Object { 

    dynamic var key = 0 
    dynamic var firstName: String? 
    dynamic var lastName: String? 
    // ... 

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

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

    var window: UIWindow? 

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
     _ = try? FileManager.default.removeItem(at: Realm.Configuration.defaultConfiguration.fileURL!) 
     let realm = try! Realm() 

     // Objects Matching Query 
     try! realm.write { 
      // Locations 
      let locations = Locations() 
      locations.zip = "12345" 

      // Companies 
      let companies = Companies() 
      companies.name = "Companies A" 
      companies.locations.append(locations) 

      // Nav 
      let nav = Navigation() 
      nav.key = 4 
      nav.companies.append(companies) 

      // Add to Realm 
      realm.add(nav) 
     } 

     let locationsIn12345AndNavigationKey4 = realm.objects(Locations.self) 
      .filter("zip == '12345' && ANY parentCompanies.parentNavigation.key == 4") 
     print(locationsIn12345AndNavigationKey4) 

     return true 
    } 
} 

Cette impression:

Results<Locations> (
    [0] Locations { 
    key = 0; 
    zip = 12345; 
    contacts = RLMArray <0x6000000f2100> (

    ); 
    } 
) 
+0

je pouvais travailler avec, mais idéalement, je voudrais qu'elle ait aussi les entreprises qui « propre » la emplacements, de sorte que l'utilisateur sache quelle entreprise ils regardent. Il y a beaucoup d'endroits nommés de la même manière, comme "Bureau principal". –

+0

facile: 'locationsIn12345AndNavigationKey4.flatMap {0.parentCompanies $}' – jpsim

+0

Pourriez-vous rendre ce code plus convivial? Est-ce censé être la chaîne qui va dans le filtre sont ces appels de fonction réels? Je suppose que cela devrait également être fait avec les relations inverses? –