TableView avec des Sections en fonction de dates

Bonjour à tous et à toutes :smile:

J'utilise une base de donnée avec Realm.
Tous mes objets sont stockés dans cette dernière et chaque objet possède une date (que je crée dans mon code avec "Date()").

J'aimerai afficher une TableView avec des sections.
Les sections seraient en fait les dates de mes objets.

Donc, par exemple:

28/01/2018
element 1
element 2

31/01/2018
element 1
...

J'arrive bien à créer une TableView, et j'arrive également à faire une TableView avec des sections en temps normal, mais dans ce cas-ci, je ne vois pas comment je peux utiliser mes dates comme sections, en partant de mes objets REALM...

Je peux récupérer mes objets en les triant selon leur date, mais comment-est ce que je peux ensuite compter le nombre de dates différentes ? Et ensuite ne récupérer que les objets dont les dates ne correspondent à la section en cours ?

Je pourrais parcourir tout mon tableau d'éléments pour ensuite le diviser en plusieurs tableaux en fonction des dates des éléments, mais je ne pense pas que ce soit l'idéal... Il doit surement exister une façon plus propre de faire ce que je cherche à faire, non ?

J'écoute attentivement toutes vos propositions et vos conseils :smiley:

Merci,

Bonne journée,

Alexandre

Mots clés:

Réponses

  • LeChatNoirLeChatNoir Membre, Modérateur

    Je ne connais pas bien Realm mais n'as tu pas moyen de faire une sort de "select distinct date from all objects" ?

    Une fois que tu as ça dans un tableau, tu peux gérer tes sections et leur affichage ainsi que les rows dans chaque section puisque tu pourras faire un select row where date=date de la section.

  • AlesckAlesck Membre

    Bonjour @LeChatNoir :)

    Je regarde si je peux faire quelque chose comme un distinct, mais je n'ai pas l'impression que ça existe avec Realm...

    Je continue de chercher, sinon, je peux toujours créer cette fonction moi-même, mais il faudra juste que je fasse attention à la rapidité du système.

    En attendant, je continue mes recherches et je reste à l'écoute de toutes propositions.

    Bonne journée,

    Alexandre

  • DrakenDraken Membre

    Je peux récupérer mes objets en les triant selon leur date, mais comment-est ce que je peux ensuite compter le nombre de dates différentes ? Et ensuite ne récupérer que les objets dont les dates ne correspondent à la section en cours ?

    Pour connaître la liste (et le nombre) des Dates contenus dans ton tableau, tu peux utiliser l’opérateur .reduce.

    https://developer.apple.com/documentation/swift/stridethrough/2924568-reduce

    Pour récupérer la liste des objets correspondant à une date bien précise, l’opérateur .filter est parfait.

    Moi je créerai un dictionnaire contenant la liste de tous les tableaux de Date, pour ne pas avoir à tout recalculer à chaque scroll de la TableView.

  • AlesckAlesck Membre
    2 févr. modifié #5

    Hello @Draken

    J'ai regardé du côté du reduce, mais je n'ai pas encore compris comment l'utiliser (encore un peu de mal avec les closures). Par contre, c'est effectivement une bonne solution et cela doit être faisable (j'ai trouvé un exemple qui le fait avec les lettres d'un mot, mais je n'ai pas encore réussis à le comprendre de manière à la convertir à ma sauce).

    Aurais-tu une petite explication à me proposer? :)

    Pour l'instant, j'ai ceci:

    let calendar = Calendar.current
    let distinctRacesDates = races.reduce(into: [:], { (counts, race) in
        counts[calendar.dateComponents([.day, .month, .year], from: race.getDate()), default: 0] += 1
    })
    print("Distinct Races: \(distinctRacesDates)")
    

    Qui me donne:

    Distinct Races: [year: 2018 month: 2 day: 1 isLeapMonth: false : 2]
    

    Donc, cela fonctionne bien, puisque au lieu d'avoir deux dates, il m'en indique une seule, mais avec deux occurrences.
    Par contre, je ne comprends pas comment je peux faire pour récupérer à nouveau un élément de type Result comme j'ai initialement (mon objet 'races').

    Merci pour votre aide,

    Alexandre

Connectez-vous ou Inscrivez-vous pour répondre.