Frage

Ich habe versucht, einen vernünftigen Weg zu finden, auf dem iPhone tägliche Daten mit Core Data speichern kann.

Meine app empfängt Daten im CSV-Format, mit einem Datum, aber keine Zeit:

date, cycles
2009-08-01, 123
2009-08-02, 234
2009-08-03, 345
2009-08-04, 456

Wenn diese Daten gespeichert sind, sollte es nur einen Datensatz pro Tag betragen. Ich dachte, das Beste, was ein NSDate zu tun zu schaffen, war zu speichernden, aber die Zeit und Zeitzonendaten Streifen aus.

Ich kann leicht eine NSDate erstellen, ohne Stunden, Minuten oder Sekunden entweder NSDateComponents oder einen NSDateFormatter verwenden. Aber selbst wenn ich die Zeitzone explizit auf UTC oder auf Null Sekunden von GMT, ein erstelltes Datum mit NSLog Ausgeben () immer hat meine lokale Zeitzone wie:

2009-07-29 00:00:00 +0100

Kennt jemand einen besseren Weg NSDates ohne Zeitkomponenten zu machen? Oder vielleicht ein besserer Weg, die Daten zu speichern?

War es hilfreich?

Lösung

Eine gute Programmierfaustregel immer speichern Daten in UTC. Dabei spielt es keine Rolle, ob Sie Core Data verwenden oder nicht; Sie werden noch einige Arbeit zu tun haben, weil Apples Datum Klassen ziemlich saugen.

Daten dargestellt werden intern als Anzahl der Sekunden seit einem Referenzdatum, das ist, glaube ich, 1. Januar 2001 00.00.00 (obwohl das tatsächliche Referenzdatum ist nicht sehr wichtig). Punkt ist, NSDate Objekte sind immer nativ in UTC. Wenn die Daten die Sie in Ihrer CSV-Datei immer lokal sind, müssen Sie so etwas tun, um die UTC-Zeit zu bekommen:

NSDate *UTCDate = [localDate addTimeInterval:-[[NSTimeZone localTimeZone] secondsFromGMT]];

Dann würde ich die Zeit auf 00:00:00 gesetzt. Jetzt sind Sie sparen das Datum, um Mitternacht, in UTC. Für Präsentationszwecke erhalten Sie eine NSDateFormatter mit der Zeitzone Ihrer Wahl (die Systemzeitzone ist der Standard, wenn Sie noch kein Konto angeben) konfiguriert verwenden, um jene Daten angezeigt werden.

Zeitzonen nicht wirklich wichtig, wenn Sie nur mit Daten zu tun, wenn. Solange Sie die Zeitzone auf Ihrem NSDateFormatter auf UTC einstellen stellen Sie sicher, dass Sie immer das gleiche Datum zeigen, egal in welcher Zeitzone der Benutzer auf ihrem Gerät ausgewählt hat.

Wenn Sie diese Lösung nicht gefällt, können Sie immer speichern Sie Ihre Reisedaten in einem anderen Format. Sie könnten ein double oder int speichern das Datum in einigem benutzerdefinierten Format (zB die Anzahl der Tage seit einigem Referenzdatum) verwenden, oder Sie können sogar Ihre eigene Klasse rollen das Datum genau so, wie Sie wollen, und speichern Sie es als NSData zu modellieren Objekt. Solange die Klasse NSCoding implementiert, können Sie es zu einem NSData Objekt in Core Data serialisiert. Sie müssen nur den Attributtyp in Core Data zu auf „Trans“.

Sie haben eine Tonne von Optionen hier, und keiner von ihnen den Aufwand verbunden eigene SQLite-Abfragen und Datenbanken zu schreiben.

Andere Tipps

Ein NSDate hat keine Zeitzone. NSLog verwendet Ihre lokale Zeitzone; es sagt, 0.100, weil das ist, wo Sie sind.

Das NSDate Objekt wird immer noch Zeit Datum übernehmen - die Dokumentation zitieren sie „[s] einen einzigen Punkt in der Zeit darstellen“ und zwar durch einen Zeitwert seit seiner Referenzdatum (Beginn 1. Januar 2001 GMT speichern, entsprechend wieder die Dokumentation). Daher können Sie keine NSDate haben, die Tageszeit nicht bewusst ist.

Anstatt versuchen, und speichern Daten Ihre eigene Art und Weise, würde ich immer noch NSDate in Ihrem Modell verwendet und betrachte ein Paar von Methoden, um Ihre Entity-Klasse hinzufügen, von denen das tun, was Sie oben beschrieben, die NSDate bis 00:00 Uhr Einstellung : 00 an einem bestimmten Tag. Der andere könnte zurückkehrt nur das Datum von einem NSDate in Ihrem bevorzugten Format. Diese würden dann mit dem Core Data-generierte Getter und Setter auf die NSDate Eigenschaft zugreifen.

Mit dem noch NSDate verwenden Sie eine Klasse verwenden, die Kerndaten können mit nativ arbeiten, so dass Sie immer noch Prädikate leicht zum Filtern verwenden können, oder sortieren Sie Ihre abgerufenen Ergebnisse nach Datum, ohne zu hart darüber nachdenken zu müssen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top