Wie verwende ich ein Prädikat für NSTimeInterval?

8

Ich möchte alle Datensätze für den aktuellen Monat abrufen, also staple ich zwei Prädikate für das erste Datum des Monats und den letzten Tag des Monats. Da ich CoreData verwende, werden die Daten tatsächlich als NSTimeInterval gespeichert.

%Vor%

Beim Zurückgeben des gefilterten Arrays stürzt es mit dieser Fehlermeldung ab:

%Vor%

Ich habe diese Schleife auch verwendet, um anzuzeigen, dass das recordDate tatsächlich innerhalb des Arrays existiert:

%Vor%     
Houman 25.10.2013, 18:18
quelle

3 Antworten

14

Sie haben die Option "Skalare Eigenschaften für primitive Datentypen verwenden" gewählt Erstellen der Unterklasse des verwalteten Objekts, sodass recordDate als dargestellt wird NSTimeInterval in der Klasse FTRecord .

Aber in einem Prädikat wie "recordDate >= 123.45" wird die linke Seite gespeichert als NSKeyPathExpression und verwendet valueForKeyPath:@"recordDate" , um auf die Eigenschaft zuzugreifen, die ein NSDate -Objekt zurückgibt. Die rechte Seite dieses Prädikats wird als NSConstantValueExpression gespeichert. mit einem Verweis auf ein NSNumber -Objekt. Deshalb wird ein NSDate mit einem NSNumber verglichen, was genau zum Ausnahme, die du hast.

Um das Problem zu beheben, müssen Sie die Eigenschaft mit einem NSDate vergleichen (was @ramaddy ursprünglich vorgeschlagen hat):

%Vor%

Ich habe das getestet und es scheint das erwartete Ergebnis zu produzieren.

Beachten Sie jedoch, dass Core Data timeIntervalSinceReferenceDate und verwendet dateWithTimeIntervalSinceReferenceDate , um zwischen dem Skalar zu konvertieren Werte und NSDate , nicht timeIntervalSince1970 .

    
Martin R 25.10.2013, 18:45
quelle
0

Fügt timeIntervalSince1970 in einem Prädikat selbst hinzu. Es geht um

NSPredicate * Prädikat = PREDICATE (@ "(lastUpdatedTime == nil ODER lastUpdatedTime.timeIntervalSince1970 & lt; =% f)", currentDate.timeIntervalSince1970);

    
Boobalan 27.11.2015 00:22
quelle
0

Zur Lösung in Swift 3:

%Vor%     
jo3birdtalk 21.09.2016 07:44
quelle