CoreData Distinct Values

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • CoreData Distinct Values

    Hallo,

    ich habe in CoreData Datensätze stehen mit einem Datum bestehend aus Tag, Monat, Jahr, Stunde, Minute, Sekunde.

    Ich würde gerne eine Liste (in SwiftUI) anzeigen lassen die nur einen Eintrag für einen Tag hat und beim Tap auf den Eintrag alle Einträge für diesen Tag.
    Beispiel Soll:

    Quellcode

    1. 23.08.2023 -> 23.08.2023 11:01
    2. 23.08.2023 11:02
    3. 23.08.2023 11:15
    4. 23.08.2023 12:05
    5. 24.08.2023 -> 24.08.2023 08:01
    6. 24.08.2023 13:07
    7. usw.

    Zur Zeit sieht es aber so aus:

    Quellcode

    1. 23.08.2023 -> 23.08.2023 11:01
    2. 23.08.2023 11:02
    3. 23.08.2023 11:15
    4. 23.08.2023 12:05
    5. 23.08.2023 -> 23.08.2023 11:02
    6. 23.08.2023 11:02
    7. 23.08.2023 11:15
    8. 23.08.2023 12:05
    9. 23.08.2023 -> 23.08.2023 11:15
    10. 23.08.2023 11:02
    11. 23.08.2023 11:15
    12. 23.08.2023 12:05
    13. 23.08.2023 -> 23.08.2023 12:05
    14. 23.08.2023 11:02
    15. 23.08.2023 11:15
    16. 23.08.2023 12:05
    17. 24.08.2023 -> 24.08.2023 08:01
    18. 24.08.2023 13:07
    19. 24.08.2023 -> 24.08.2023 13:07
    20. 24.08.2023 13:07
    21. usw.
    Alles anzeigen



    Wie kann ich in CoreData eine art "Select distinct(datum)" machen um nur ein Datum zu erhalten? Alles was ich dazu finde bezieht sich auf NSFetchRequest, das mag aber XCode nicht mehr haben. Ich verwende derzeit
    @FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \Kassen.datum, ascending: true)]) var alleBuchungen:FetchedResults<Kassen> und ich finde bei FetchRequest keine der NSFetchRequest optionen wie "returndistinctvalues = true"
    Danke im voraus für eure immer hilfreichen Antworten

    Gruß

    Dirk
  • Moin,

    distinct ist da in meinen Augen nicht der richtige Schlüsselbegriff, da die Dates trotz gleichen Tages ja nicht exakt identisch sind. Auch in SQL würdest du das vermutlich eher mit einem GROUP BY lösen (wobei ich kein SQL-Experte bin...). Es gibt Möglichkeiten, diese Gruppierung im CoreData-Fetch Request direkt vorzunehmen, das ist aber etwas schwierig weil du ja zunächst das Uhrzeit-befreite Datum heraus extrahieren musst. Daher würde ich das einfach im Anschluss, "Swift nativ", machen, nachdem sich an der Gesamtmenge an gefetchted Daten dadurch nichts ändert.

    Für die Tages-Gruppierung von Swift Dates helfen z.B. DateComponents, dafür gibt es bereits jede Menge Lösungsvorschläge wie z.B. hier: stackoverflow.com/questions/44…-objects-by-date-in-swift

    Viele Grüße
  • Osxer schrieb:

    Moin,

    distinct ist da in meinen Augen nicht der richtige Schlüsselbegriff, da die Dates trotz gleichen Tages ja nicht exakt identisch sind. Auch in SQL würdest du das vermutlich eher mit einem GROUP BY lösen (wobei ich kein SQL-Experte bin...). Es gibt Möglichkeiten, diese Gruppierung im CoreData-Fetch Request direkt vorzunehmen, das ist aber etwas schwierig weil du ja zunächst das Uhrzeit-befreite Datum heraus extrahieren musst. Daher würde ich das einfach im Anschluss, "Swift nativ", machen, nachdem sich an der Gesamtmenge an gefetchted Daten dadurch nichts ändert.

    Für die Tages-Gruppierung von Swift Dates helfen z.B. DateComponents, dafür gibt es bereits jede Menge Lösungsvorschläge wie z.B. hier: stackoverflow.com/questions/44…-objects-by-date-in-swift

    Viele Grüße
    Wie immer hier: du hast völlig recht. Das Datum kann nicht distinct sein...... blöd ist, das ich keine Ahnung habe wie ich in Swift mal so in einer Function die Daten aus CoreData ziehen kann. CoreData ist etwas...... seltsam..... vom handling, finde ich. Das "Group by" dürfte auch nicht gehen, weil es wiederrum gleiche Werte Gruppiert, im Datum werden aber auch Millisekunden erfasst. Es wird als mit an sicherheitgrenzender Warscheinlichkeite keine 2 gleichen Einträge dort geben.
  • Erweitere doch einfach die Entity um ein zusätzliches Feld Datum (ohne Uhrzeit). Dann kannst Du die Gruppierung direkt im FetchRequest verwenden.

    Wenn Du dann einen NSFetchedResultsController verwendest, dann solltest Du das reine Datum als Section erhalten. Innerhalb der Section (Datum) sind dann die einzelnen Einträge (Datum + Uhrzeit) als Rows vorhanden.

    Mit UIKit kannst Du die TableView dann je Section auf-/zuklappen lassen. Dies sollte sich mit SwiftUI sicherlich auch realisieren lassen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von MCDan ()