CoreData, ein FetchRequest mit Predicate mit NSDate Vergleich

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

  • CoreData, ein FetchRequest mit Predicate mit NSDate Vergleich

    Moin,

    ich möchte einen Fetchrequest erstellen der die eingetragenen Datensätze u.A. mit der Eigenschaft "(NSDate*)datum" mit dem aktuellen Datum vergleicht.
    Bekomme aber die Meldung "Unable to parse the format string..." Hab schon mehrere Varianten ausprobiert aber anscheinend noch nicht die Richtige gefunden.
    Bräuchte mal n Tipp...

    Gruß

    Quellcode

    1. NSDate * datum = [NSDate date];
    2. fetchRequest.predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"zeitpunkt == %@",datum]];
  • Das Problem hatte ich auch :)

    Quellcode

    1. NSTimeInterval length;
    2. [[NSCalendar currentCalendar] rangeOfUnit:NSCalendarUnitDay startDate:&date interval:&length forDate:date];
    3. NSDate *endDate = [date dateByAddingTimeInterval:length];
    4. NSPredicate *datepredicate = [NSPredicate predicateWithFormat:@"(date >= %@) AND (date < %@)", date, endDate];


    Das Predicate liefert dir alle Einträge, bei denen das Datum am gleichen Tag wie date ist. date ist der Name des Attributes in der Entity und der Name der Variablen mit dem Datum, was verglichen werden soll.
    Wenn du auf andere Vergleiche gehen willst (z.B. gleiche Stunde) dann spiel mit NSCalendarUnitDay rum. Da wäre z.B. NSCalendarUnitHour alle Daten mit gleicher Stunde.
    Es gibt zwei Dinge, die sind unendlich. Das Universum und die menschliche Dummheit. Wobei beim Universum bin ich mir nicht sicher - Albert Einstein
  • "Wurde exakt so gespeichert" ist mindestens fragwürdig. Vielleicht hast du es exakt so übergeben. Aber ist die Genauigkeit, die Core Data (MySQLite) zur Speicherung verwendet, dieselbe, die im Hauptspeicher verwendet wird … Da warten noch Überraschungen auf dich.

    Davon abgesehen ist ein Datum kein String. Es ist ein Datum. Du machst jetzt etwas Bemerkenswertes: Du baust das Prädikat als String, um es dann so als Prädikat zu übergeben. Wieso genau lässt du nicht NSPredicate das Prädikat bauen? Willst du mal ausprobieren, wie weit man so gehen kann?
    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"?
  • Mit der Anfrage

    Quellcode

    1. NSDate *date = [NSDate date];
    2. fetchRequest.predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"zeitpunkt == %@",datum]];


    wird es sehr schwer überhaupt ein Treffer zu finden, da [NSDate date] auf Sekunde genau das aktuelle Datum nimmt (durch die Kommastellen noch genauer). Da ist ein BETWEEN deutlch besser.
  • @Amin Negm-Awad
    Ähm - ich muß mich entschuldigen!! Hab gedacht Deine Antwort führt mich nicht zur Antwort der eigentlichen Frage: Warum "Unable to parse the format string..."
    Das Problem war tatsächlich die Verkettung von PredicateWithFormat mit StringWithFormat. Warum ist mir noch nicht ganz klar aber jetzt wird der Ausdruck akzeptiert.

    Die Frage nach Genauigkeit und Übereinstimmung des NSDate mit meinem Vergleich kann ich jetzt prüfen und sag noch mal Bescheid.

    @All
    Danke für die rege Beteiligung!
  • ja, einverstanden.
    Jetzt ist es die Frage, ob der NSDate wert (intern eigentlich ja float oder?) den ich im CD-Objekt abspeichere (als NSDate) aus der Variablen wieder findbar ist mit der beibehaltenen Variablen beim direkten Suchen eben mit dieser Variablen.
  • Quellcode

    1. NSDate *date = [NSDate new];
    2. mo.date = date;
    3. // save, reset, fetch von mo
    4. if ([date isEqualToDate:mo.date])
    5. {
    6. // Ob dieser Code stets erreicht wird?
    7. }


    Wie schon gesagt: Dates sind eigentlich Fließkommazahlen. Und was macht man nicht mit Fließkommzahlen? Richtig, auf Gleichheit prüfen.
    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"?
  • EiZen schrieb:

    @Amin Negm-Awad
    Das Problem war tatsächlich die Verkettung von PredicateWithFormat mit StringWithFormat. Warum ist mir noch nicht ganz klar...

    +[stringWithFormat:] erzeugt einen String und das %@ wird durch [datum description] ersetzt. Das Ganze ist also ein fester String mit der Default-Formatierung für NSDate angewendet auf 'datum'. Diesen String setzt Du als Prädikat. Also wird versucht die Objekte mit dem über -description formatierten String (!) zu vergleichen und nicht mit dem Objekt.
    Bei -predicateWithFormat: with das %@ NICHT durch -description ersetzt sondern bleibt das Objekt.
    Also ist die Antworte auf die Frage "warum?": %@ hat bei -stringWithFormat: eine andere Bedeutung als bei -predicateWithFormat: