CoreData und Group By bzw. SUM

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

  • CoreData und Group By bzw. SUM

    Hallo Zusammen, ich habe eine Frage zu CoreData. Ich habe einen Entitie der das Kommen Datum und das Gehen Datum speichert.
    Jetzt wollte ich die aufsummierte Anwesenheitszeit in einer Tabelle anzeigen lassen. Aber irgendwie stehe ich etwas auf dem Schlauch.

    In anderen Datenbanken sollte man nicht die errechneten Werte Speicher, ist dies hier auch so?
    Gibt es wie bei MySQL eine Abfrage die mir die Werte liefern kann?

    Kann mir da jemand auf die Sprünge helfen?

    Danke

    Gruß Marvin
  • Marvin75 schrieb:

    Hallo Zusammen, ich habe eine Frage zu CoreData. Ich habe einen Entitie der das Kommen Datum und das Gehen Datum speichert.
    Jetzt wollte ich die aufsummierte Anwesenheitszeit in einer Tabelle anzeigen lassen. Aber irgendwie stehe ich etwas auf dem Schlauch.

    In anderen Datenbanken sollte man nicht die errechneten Werte Speicher, ist dies hier auch so?
    Gibt es wie bei MySQL eine Abfrage die mir die Werte liefern kann?

    Kann mir da jemand auf die Sprünge helfen?

    Danke

    Gruß Marvin
    Hallo Marvin75,

    ich bin nun wahrlich kein Experte was das Thema Core Data angeht, bin gerade dabei mich ebenfalls in dieses Gebiet einzuarbeiten.

    Zu Deinen Fragen bzw. wie ich es lösen würde:
    - Du musst Dir via Delegate den Zugriff auf den managedContext verschaffen
    - dann eine Verbindung zu der angelegten Entität via NSFetchRequest erzeugen
    - nun kannst Du die Aktionen wie Abfragen, Speichern ect. durchführen

    Anbei ein Beispiel:

    Quellcode

    1. guard let appDelegate = NSApplication.shared.delegate as? AppDelegate else { return }
    2. let managedContext = appDelegate.persistentContainer.viewContext
    3. let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Name Deiner Entität eintragen")
    4. var ergebnisMenge = try managedContext.fetch(fetchRequest)

    Die Ergebnismenge kann nun ausgewertet werden. Z.B. in einer For-Schleife die Zeiten berechnen lassen. An dieser Stelle habe ich ebenfalls noch einige Fragen. Schau einfach in meinen Beitrag.

    Ob es eine Abfragemöglichkeit wie Group oder SUM gibt kann ich Dir zum jetzigen Zeitpunkt nicht beantworten.

    Deine errechneten Werte kannst Du selbstverständlich speichern. Ob dies relevant und sinnvoll ist, hängt von Deiner Vorgehensweise ab.

    Gruß OSXDev

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von OSXDev ()

  • Hallo OSXDev,

    bis jetzt hat ich das so gemacht. Dort kommen alle Datensätze, die im predicate gefiltert worden sind, raus.

    Über

    Quellcode

    1. if let listen = LoadZeiten(Kalenderwoche: kw) {
    2. ListeZeiten = listen
    3. tableView.reloadData()
    4. }
    bekomme ich das Objekt in die Variable ListeZeiten und kann diese dann auch in der Tabellenfunktion benutzen, halt nicht aufsummiert.
    Daher dachte ich das es wie bei SQL ist das man eine Abfrage erstellen kann, das ein geändertes Objekt erzeugt.


    Ich wollte mir eine Klasse Buchungen anlegen und dort die ganzen Datensätze inkl. der summierten Werte Gleitzeit, Anwesenheit etc...) reinschreiben, allerdings klappt das nicht.

    Quellcode

    1. let mgdContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    2. func LoadZeiten(Kalenderwoche: Int16) -> [DB_Zeiten]? {
    3. let request: NSFetchRequest<DB_Zeiten> = DB_Zeiten.fetchRequest()
    4. request.sortDescriptors = [NSSortDescriptor(key: "kommen", ascending: true)]
    5. request.predicate = NSPredicate(format: "status == 'Abgeschlossen' AND kw == \(Kalenderwoche)")
    6. do {
    7. let result = try mgdContext.fetch(request)
    8. return result
    9. }
    10. catch {
    11. print(error.localizedDescription)
    12. }
    13. return nil
    14. }
    15. import Foundation
    16. import CoreData
    17. import UIKit
    18. class buchungen {
    19. var kommen: Date
    20. var gehen: Date
    21. var latitude_kommen: Double
    22. var longitude_kommen: Double
    23. var latitude_gehen: Double
    24. var longitude_gehen: Double
    25. var region_kommen: String
    26. var region_gehen: String
    27. var status: String
    28. var typ: String
    29. var gps: Bool
    30. var manuel: Bool
    31. var gleitzeit: Double
    32. var arbeitszeit: Double
    33. var pausenzeit: Double
    34. init(kommen: Date,
    35. gehen: Date,
    36. latitude_kommen: Double,
    37. longitude_kommen: Double,
    38. latitude_gehen: Double,
    39. longitude_gehen: Double,
    40. region_kommen: String,
    41. region_gehen: String,
    42. status: String,
    43. typ: String,
    44. gps: Bool,
    45. manuel: Bool,
    46. gleitzeit: Double,
    47. arbeitszeit: Double,
    48. pausenzeit: Double)
    49. {
    50. self.kommen = kommen
    51. self.gehen = gehen
    52. self.latitude_kommen = latitude_kommen
    53. self.longitude_kommen = longitude_kommen
    54. self.latitude_gehen = latitude_gehen
    55. self.longitude_gehen = longitude_gehen
    56. self.region_kommen = region_kommen
    57. self.region_gehen = region_gehen
    58. self.status = status
    59. self.typ = typ
    60. self.gps = gps
    61. self.manuel = manuel
    62. self.gleitzeit = gleitzeit
    63. self.arbeitszeit = arbeitszeit
    64. self.pausenzeit = pausenzeit
    65. }
    66. }
    Alles anzeigen
  • Marvin75 schrieb:

    Hallo OSXDev,

    bis jetzt hat ich das so gemacht. Dort kommen alle Datensätze, die im predicate gefiltert worden sind, raus.

    Über ...
    bekomme ich das Objekt in die Variable ListeZeiten und kann diese dann auch in der Tabellenfunktion benutzen, halt nicht aufsummiert.
    Daher dachte ich das es wie bei SQL ist das man eine Abfrage erstellen kann, das ein geändertes Objekt erzeugt.
    Was spricht dagegen in der tableView ein weiteres Column anzulegen und für dieses eine Action zu hinterlegen, in welcher Du die Anwesenheitszeit errechnen lässt? Nun musst Du nur noch über dieses Column die Summe bilden. Oder missverstehe ich Dich?
  • Es ist ja möglich das mehrmals am Tag Kommen und Gehen gebucht wird, und diese Summe hätte ich gerne pro Tag summiert. Später in der Detailansichtstabelle langt mir meine Funktion, da hier dann Tagesweise die Datensätze angezeigt werden sollen. Hierzu muss ich dann das Predicate umstellen, aber das bekomme ich hin.
    Einfacher wäre es wenn ich ein neues angepasstes Objekt aus dem Entitie und den errechneten Werten hätte.
  • Dann würde die Tabelle nicht mehr so übersichtlich aussehen und was passiert wenn dort einer klickt welchen Datensatz soll dann angezeigt werden?

    Welche Doku benutzt Du denn zum einlesen, ich habe bisher die Videos auf Udemy.com angesehen, hat mir zu mindestens für die Einsteiger Erfahrungen etwas gebracht.
  • Marvin75 schrieb:

    Dann würde die Tabelle nicht mehr so übersichtlich aussehen und was passiert wenn dort einer klickt welchen Datensatz soll dann angezeigt werden?

    Welche Doku benutzt Du denn zum einlesen, ich habe bisher die Videos auf Udemy.com angesehen, hat mir zu mindestens für die Einsteiger Erfahrungen etwas gebracht.
    Ich verwende das Buch von Koffer Swift 3 Rheinwerk Verlag.
  • Marvin75 schrieb:

    Es ist ja möglich das mehrmals am Tag Kommen und Gehen gebucht wird, und diese Summe hätte ich gerne pro Tag summiert. Später in der Detailansichtstabelle langt mir meine Funktion, da hier dann Tagesweise die Datensätze angezeigt werden sollen. Hierzu muss ich dann das Predicate umstellen, aber das bekomme ich hin.
    Einfacher wäre es wenn ich ein neues angepasstes Objekt aus dem Entitie und den errechneten Werten hätte.
    Okay, nun ist Dein Anliegen nachvollziehbar.

    Anbei mal mein Sourcecode (wie ich meine Klasse beschreibe):

    Quellcode

    1. func fetchPersonData() -> [Person]? {
    2. var persons = [Person]()
    3. let managedContext = (NSApplication.shared.delegate as? AppDelegate)?.persistentContainer.viewContext
    4. let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "People")
    5. fetchRequest.sortDescriptors = [NSSortDescriptor(key: "vornamen", ascending: true)]
    6. fetchRequest.predicate = NSPredicate(format: "status == 'Mitglied'")
    7. do {
    8. let results = try managedContext?.fetch(fetchRequest)
    9. let People = results as! [People]
    10. for person in People {
    11. persons.append(Person(sVornamen: person.vornamen!,
    12. sNachnamen: person.nachnamen!,
    13. sGeschlecht: person.geschlecht!,
    14. sAugenfarbe: person.augenfarbe!,
    15. sHobby: iAlter: Int(person.alter)))
    16. }
    17. }
    18. catch
    19. {
    20. print(error.localizedDescription)
    21. }
    22. return persons
    23. }
    Alles anzeigen
    Bitte beachte, dass dies für OS X geschrieben ist. Musst also die notwendigen Stellen für IOS anpassen und natürlich Deine Klassenattribute einsetzen. Danach sollte dies auch bei Dir mit Deiner Klasse funktionieren.

    Viel Spaß