2017-10-09 1 views
0

Ich lese Gesundheit Werte meines iPhone von meiner objektiven c-App. Ich brauche nur die letzten 10 Tage zu lesen, aber ich kann keine Abfrage tun, um dies zu tun.Wie kann ich die letzten 10 Tage von healthkit bekommen?

Ich versuche, die Abfrage mit diesem Code in ein Prädikat hinzu:

NSPredicate *explicitforDay = 
[NSPredicate predicateWithFormat:@"%K >= %@ AND %K <= %@", 
HKPredicateKeyPathDateComponents, startDateComponents, 
HKPredicateKeyPathDateComponents, endDateComponents]; 

Und dann habe ich versucht, dies:

NSPredicate *explicitforDay = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"%@ < %%@ AND %@ >= %%@", HKPredicateKeyPathStartDate 
                    , HKPredicateKeyPathEndDate], myFirstDate, myEndDate]; 

Aber in der Ausgabe kann ich einige wie diese:

(startdatum < CAST (529279732.871222, "NSDate") UND endDate> = CAST (527983732.871222, "NSDate"))

Warum werden CAST und falsche Datumswerte gedruckt? Danke!

+0

Ich sehe weder einen Druckbefehl in Ihrem Code noch die tatsächlichen Werte der Daten. Daher ist es schwer zu sagen, ob der Ausdruck korrekt ist. –

Antwort

0

Ein Datum ist einfach eine Zahl. Ich habe eine längere Erklärung für dieses here gepostet.

Also eine einfache Zahl wird in die Aussage gesetzt. Es ist die numerische Darstellung Ihres Datums. Um die Zahl als Datum zu behandeln, wird sie an den angegebenen Typ "NSDATE" übergeben.

0

Swift 4 Lösung:

in meinem Beispiel verwende ich die bequeme Methode HKQuery.predicateForSamples, dies ist ein Prädikat für Proben, deren Start- und Enddatum fallen innerhalb des festgelegten Zeitintervall.

Sie müssen die letzten 10 Hier ist zu lesen, wie ein Datum -10 Tage ab jetzt Date()

Für -10 pervious Tage

startdate ist zu bekommen: Calendar.current.date(byAdding: .day, value: -10, to: Date())!

Hinweis : Sie können das Datum verwenden, von dem Sie das Datum der nächsten und vorherigen Tage möchten, ändern Sie einfach Date().

endDate ist: Date() -> (das aktuelle Datum)

Also mein Prädikat sieht aus wie mit einem bestimmten Zeitintervall.

let predicate = HKQuery.predicateForSamples(
        withStart: startDate.beginningOfDay(), 
        end: endDate, 
        options: [.strictStartDate,.strictEndDate]) 

wie u kann in meinem Prädikat sehe ich beginningOfDay() Methode bin, diese wird mir erlauben, das Datum, ab 00:00

beginningOfDay() Methodenbeschreibung zu starten:

func beginningOfDay() -> Date { 
     let beginningOfDay = Calendar.current.startOfDay(for: self) 
     return beginningOfDay 
    } 

Sie Sie können auch eine Prädikatformat-Zeichenfolge erstellen, um äquivalente Prädikate zu erstellen, wie in heathkitDoc beschrieben.

let explicitTimeInterval = NSPredicate(format: "%K >= %@ AND %K < %@", 
             HKPredicateKeyPathEndDate, myStartDate, 
             HKPredicateKeyPathStartDate, myEndDate) 

Hoffentlich, wird den Trick tun.

Verwandte Themen