Predicate um Wochentag in CoreData zu filtern !

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

Macoun 2019 - Frühbucherrabatt bis 26.7.2019

  • Predicate um Wochentag in CoreData zu filtern !

    Hallo,

    bräuchte eine Tip, da ich nicht weiterkomme.

    meine Daten haben ein Attribut "Datum" , ich möchte nun für jeden Tag der Woche einen Wert summieren,
    also z.B. alle Einträge mit Datum an einem Montag filtern.
    Wie müsste mein Predicate aussehen ?

    predicate_WoTag = [NSPredicate predicateWithFormat: ???


    Wäre super wenn mir da jemand einen Tipp hätte !
    MfG. Bernhard
    (hb-mobilesoft.de)
  • Mac & i Test Abo
  • Es gibt eine schmuddelige Lösung, wenn du das Datum als Timestamp (Zeit in Sekunden) hast. Dann kannst du die Anzahl der Tage ausrechnen und damit den Wochentag:

    Quellcode

    1. (2 + timestamp / 86400) % 7
    Die 2 in dem Term steht für den Donnerstag, auf den der 1.1.1970 fiel. Wie gesagt: Das ist sehr schmuddelig und kann für Zeitstempel an bestimmten Uhrzeiten wegen der Sommerzeit und Schaltsekunden zu falschen Ergebnissen führen.

    Wenn deine Objekte im Hauptspeicher liegen, kannst du auch eine transiente Property für den Wochentag anlegen, und danach filtern. Bei Core Data musst du also erst alle Objekte in ein Array laden und dann das Array filtern. Dabei kannst du dann den Wochentag schön sauber mit NSCalendar & Co. ausrechnen.
    „Meine Komplikation hatte eine Komplikation.“
  • macmoonshine schrieb:

    Es gibt eine schmuddelige Lösung, wenn du das Datum als Timestamp (Zeit in Sekunden) hast. Dann kannst du die Anzahl der Tage ausrechnen und damit den Wochentag:

    Quellcode

    1. (2 + timestamp / 86400) % 7
    Die 2 in dem Term steht für den Donnerstag, auf den der 1.1.1970 fiel. Wie gesagt: Das ist sehr schmuddelig und kann für Zeitstempel an bestimmten Uhrzeiten wegen der Sommerzeit und Schaltsekunden zu falschen Ergebnissen führen.

    Wenn deine Objekte im Hauptspeicher liegen, kannst du auch eine transiente Property für den Wochentag anlegen, und danach filtern. Bei Core Data musst du also erst alle Objekte in ein Array laden und dann das Array filtern. Dabei kannst du dann den Wochentag schön sauber mit NSCalendar & Co. ausrechnen.
    und zeitzonen? ;)
  • Also meiner Meinung nach gehört sowas in die Businesslogik der Anwendung und hat damit nichts in der Persistenzschicht verloren. Ergo wirst Du wahrscheinlich nicht darum herum kommen, das mit Code (sprich in den Speicher geladenen MOs) und entspr. NSCalendar-Logik abzudecken. Dann sind auch alle Zeitzonen/Schaltjahr etc. Fälle abgedeckt und sollte es dann wirklich ein Performanceproblem gegeben, kannst Du dann immer noch tunen.
  • gritsch schrieb:

    macmoonshine schrieb:

    Es gibt eine schmuddelige Lösung, wenn du das Datum als Timestamp (Zeit in Sekunden) hast. Dann kannst du die Anzahl der Tage ausrechnen und damit den Wochentag:

    Quellcode

    1. (2 + timestamp / 86400) % 7
    Die 2 in dem Term steht für den Donnerstag, auf den der 1.1.1970 fiel. Wie gesagt: Das ist sehr schmuddelig und kann für Zeitstempel an bestimmten Uhrzeiten wegen der Sommerzeit und Schaltsekunden zu falschen Ergebnissen führen.

    Wenn deine Objekte im Hauptspeicher liegen, kannst du auch eine transiente Property für den Wochentag anlegen, und danach filtern. Bei Core Data musst du also erst alle Objekte in ein Array laden und dann das Array filtern. Dabei kannst du dann den Wochentag schön sauber mit NSCalendar & Co. ausrechnen.
    und zeitzonen? ;)
    Guter Hinweis; für MEZ also

    Quellcode

    1. (2 + (timestamp + 3600) / 86400) % 7
    und es wird immer schmuddeliger. ;)
    „Meine Komplikation hatte eine Komplikation.“
  • Hi, danke euch.

    Dachte es wäre evtl. direkt im Predicate möglich,
    aber dann muss ich halt das Request-Array durchlaufen und mir aus dem Datum den Wochentag
    rausziehen und die Summen manuell addieren, laut Erfahrung ist diese Berechnung in der Perfomence nicht spürbar.

    Über ein Predicate hätte ich halt einfach mit den AVG, Sum, Funktionen arbeiten können,
    so muss ich mir die entsprechenden Filter-Arrays halt mit bisschen mehr Code erstellen.
    MfG. Bernhard
    (hb-mobilesoft.de)
  • Ich habe heute Morgen ja schon die Frage gelesen und dachte mir: "Das wird eine längere Erläuterung, das schaffst du jetzt nicht." Nun ist vieles schon gesagt worden, meiner Meinung aber nicht das Entscheidende:




    Paulsche schrieb:

    meine Daten haben ein Attribut "Datum" , ich möchte nun für jeden Tag der Woche einen Wert summieren,
    also z.B. alle Einträge mit Datum an einem Montag filtern.

    Was soll denn ein Montag sein? Ein Montag in Paris, Texas, oder ein Montag in Paris, Frankreich? Kommt es auf die Zeit des Eingebenden an? Oder auf die Zeit der Firmenzentrale in Wisconsin? Oder haben die Daten vielleicht einen örtlichen Bezug, so dass die Zeit dieses Ortes gilt?

    Diese Frage musst alleine du aus deiner Geschäftslogik beantworten: Was ist überhaupt gewollt?

    Und wenn du sie beantwortet hast, geht es ganz einfach mit einem Integer und einem Prädikat.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Warum ?

    Mir würden diese Angaben im Moment reichen.

    Also ich habe es jetzt so vor zu machen:
    Für jede WochentagNr ein Mutablearray z.B. arr_schnittLiterpreis[8]
    in einer Schleife alle Tankeinträge durchlaufen, WochtagNr. ermitteln
    und dem Array adden:

    Quellcode

    1. for (int i=0; i<tankEintraege.count; i++) {
    2. _tankItem = [tankEintraege objectAtIndex:i];
    3. dateComponents = [[NSCalendar currentCalendar] components:NSCalendarUnitWeekday fromDate:_tankItem.datum];
    4. tag = dateComponents.weekday;
    5. [arr_schnittLiterpreis[tag] addObject:_tankItem.literpreis];
    6. }
    MfG. Bernhard
    (hb-mobilesoft.de)
  • Na, dann wird doch der Current-Calendar ausreichen und du kannst beim Setzen des Datums gleich eine Hilfseigenschaft mit dem Wochentag setzen. Die landet dann in Core Data und du hast dein Prädikat.

    Und wenn dann der Nutzer mit dem Auto nach Moskau fährt, soll er halt nicht nach 23.00 Uhr tanken. Ihn dürfte auch der deutsch-russische Durchschnittspreis nicht so wahnsinnig interessieren.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Paulsche schrieb:

    Warum ?

    Mir würden diese Angaben im Moment reichen.

    Also ich habe es jetzt so vor zu machen:
    Für jede WochentagNr ein Mutablearray z.B. arr_schnittLiterpreis[8]
    in einer Schleife alle Tankeinträge durchlaufen, WochtagNr. ermitteln
    und dem Array adden:

    Quellcode

    1. for (int i=0; i<tankEintraege.count; i++) {
    2. _tankItem = [tankEintraege objectAtIndex:i];
    3. dateComponents = [[NSCalendar currentCalendar] components:NSCalendarUnitWeekday fromDate:_tankItem.datum];
    4. tag = dateComponents.weekday;
    5. [arr_schnittLiterpreis[tag] addObject:_tankItem.literpreis];
    6. }
    Brauchst du doch dann nicht mehr. Mit einem Prädikat fischst du dir die richtigen Einträge heraus und mit @avg berechnest du den Durchschnitt. Aber mit Core Data sollte es noch einfacher gehen:

    - Dictionary-Fetch
    - Group-By auf den Wochentag
    - Expression mit @avg
    - Ab damit in die Datenbank.

    Muss man halt probieren, ob diese Kombination von Core Data gerade verkraftet wird. Ist ein bisschen Voodoo. Vorteil: Alles wird in der SQL-Engine erledigt und 0 Tankeinträge haben einen Fault-In.

    Dann muss man sich auch nicht mehr überlegen, ob es 1.000.000 Einträge sind.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Paulsche schrieb:

    Danke, ich mach mich schlau und teste wie ich das am besten mache,
    beim anlegen des Datensatzes gleich den Wochentag in ein Attribut speichern
    wäre wohl tatsächlich am einfachsten.
    Jo, eben. Funktioniert natürlich nur, wenn du den Kalender dann schon kennst, was bei dir der Fall ist. Daher auch meine Frage.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?