Bonjour tout le monde,
J’essaye de trier une liste Realm, non pas sur une propriété de mon objet Realm, mais sur un Count de cette propriété.
Un exemple vaut mieux qu’un long discours…
J’ai un objet “Personne” dans lequel il y a un nom et une liste de catégories:
class Personne {
@objc dynamic private var nom:String = ""
var categories:List<Categorie> = List<Categorie>()
}
J’aimerai pouvoir récupérer ces personnes de ma base de donnée Realm en les triant par leur nombre de catégories. J’ai essayé ce qui suit, mais ce n’est pas pris en charge par Realm:
realm.objects(Personne.self).sorted(byKeyPath: "categories.@count", ascending: true)
Et je ne trouve rien dans la documentation de Realm qui m’indique comment je peux m’en sortir dans un cas de figure comme celui-ci…
Est-ce que vous avez une idée ?
Je pourrais stocker le nombre de catégorie par personne, mais je trouve ça innutile, puisque je peux le savoir en faisant “catégories.count”, donc pas besoin de stocker le nombre de catégories…
Avec une fonction calculée dans ma classe Personne qui compte le temps de catégorie peut-être ?
Merci pour votre aide,
Bonne journée,
Alexandre
J’essaye de comprendre. Tes personnes ont une catégorie A, une catégorie B, une catégorie C … etc ?
Et tu veux les trier en fonction de celui qui en détient le plus ( de A a Z ) ou en fonction de celui qui a le plus de A ou plus de B … etc ?
Oui, par exemple, une personne Alice est dans 3 groupes: A, B et C, et une deuxième personne Bob est dans 2 groupes: A et B, donc, le tri serait: Alice puis Bob (puisque Alice est dans plus de groupes que Bob)
Tu vois ce que je veux dire?
Perso je ferais ça très simplement :
realm.objects(Personne.self).sorted(byKeyPath: "TotalCat", ascending: true)
Après je ne sais pas comment tu as construit la base de donnée
Oui, c’est ce que je pensais aussi, mais j’essayais de trouver un moyen autre, parce que le « TotalCat » est calculable avec « Personne.categories.count »
Donc par exemple, si j’ai:
let Alice:Personne
Je peux faire:
Alice.categories.count // == Alice.TotalCat
Donc il y a un peu redondance des données, non?
Le « soucis », c’est que donc je dois mettre manuellement à jour le « TotalCat », et je cherchais un moyen d’éviter ça
J’ai pas assez d’éléments pour savoir de quelle façon ta base de donnée est construite. Du coup j’ai du mal à aller plus loin dans la réflexion
Voici à quoi de ressemble mes objets Realm (donc aussi la structure de ma DB):
class Personne: Object {
@objc dynamic private var nom:String = ""
var categories:List<Categorie> = List<Categorie>()
}
class Categorie: Object {
@objc dynamic private var nom:String = ""
let personnes:LinkingObjects<Personne> = LinkingObjects(fromType: Personne.self, property: "categories")
}
Merci du temps que tu prends pour me répondre
J’en n’ai pas encore eu l’occasion de travailler avec les LinkingObject. Mais je sais que tu peux travailler de cette façon.
Au lieu de déterminer Alice.categorie.count tu peux faire un appel de cette façon, catégories.Alice.count que tu mets en rapport avec avec catégories.Bob.count.
Essai et C’est peut-être une piste.
J’ai vite fais un survole de la doc de realm et je pense que tu peux solutionner ton problème avec la partie Inverse Relationships de la doc
Je vais y jeter un oeil, merci
Je n’ai pas encore eu le temps d’y regarder (je suis en examen, donc un peu moins de temps pour le moment)
J’y regarde demain normalement
Hello @alexandre.cane
En fait, le soucis, c’est que je ne peux pas utiliser le .count dans ma requête REALM pour les tris donc, que je fasse bob.categories.count ou categories.bob.count, ca ne fonctionne pas.
En fait, je pense que je vais devoir faire ma requête REALM et seulement ensuite faire un tri “manuel” (avec ma propre méthode) sur les résultats que je récupérerai avec la requête.
Mais s’il y a d’autres moyens, j’écoute toujours