So speichern Sie Daten ohne Zeiten in Core Data

8

Ich habe versucht, eine sinnvolle Möglichkeit zu finden, tägliche Daten mit Core Data auf dem iPhone zu speichern.

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

%Vor%

Wenn diese Daten gespeichert werden, sollte nur ein Datensatz pro Tag vorhanden sein. Ich dachte mir, dass das beste, was zu tun ist, ein NSDate zu erstellen, um gespeichert zu werden, aber die Zeit auszustreifen & amp; Zeitzonendaten.

Ich kann ohne NSDateComponents oder NSDateFormatter einfach ein NSDate ohne Stunden, Minuten oder Sekunden erstellen. Aber selbst wenn ich die Zeitzone explizit auf UTC oder auf Null Sekunden von GMT einstelle, hat die Ausgabe eines erstellten Datums mit NSLog () immer meine lokale Zeitzone wie folgt:

%Vor%

Kennt jemand eine bessere Möglichkeit, NSDates ohne Zeitkomponenten zu erstellen? Oder vielleicht eine bessere Möglichkeit, die Daten zu speichern?

    
Ben 05.08.2009, 09:45
quelle

3 Antworten

9

Eine gute Programmierregel ist es, Daten immer in UTC zu speichern. Es spielt keine Rolle, ob Sie Core Data verwenden oder nicht. Sie müssen immer noch etwas arbeiten, weil Apples Terminklassen ziemlich schlecht sind.

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

%Vor%

Dann würde ich die Zeit auf 00:00:00 setzen. Jetzt speichern Sie das Datum um Mitternacht in UTC. Zu Präsentationszwecken verwenden Sie eine NSDateFormatter , die mit der Zeitzone Ihrer Wahl konfiguriert wurde (die Systemzeitzone ist die Standardeinstellung, wenn Sie keine angeben), um diese Daten anzuzeigen.

Zeitzonen spielen aber keine Rolle, wenn Sie nur mit Daten zu tun haben. Solange Sie sicherstellen, dass die Zeitzone in NSDateFormatter auf UTC eingestellt ist, wird immer dasselbe Datum angezeigt, unabhängig davon, welche Zeitzone der Benutzer auf seinem Gerät ausgewählt hat.

Wenn Ihnen diese Lösung nicht gefällt, können Sie Ihre Daten immer in einem anderen Format speichern. Sie können ein double oder int verwenden, um das Datum in einem benutzerdefinierten Format zu speichern (z. B. die Anzahl der Tage seit einem Referenzdatum) oder Sie können sogar Ihre eigene Klasse rollen, um das Datum genau so zu modellieren, wie Sie es möchten und speichern es als NSData -Objekt. Solange die Klasse NSCoding implementiert, können Sie sie in Core Data zu einem Objekt NSData serialisieren. Sie müssen nur den Attributtyp in Core Data auf "Transformable" setzen.

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

    
Alex 05.08.2009, 14:59
quelle
3

Ein NSDate hat keine Zeitzone. NSLog verwendet Ihre lokale Zeitzone; es sagt +0100, weil du da bist.

    
Peter Hosey 05.08.2009 17:03
quelle
2

Das NSDate-Objekt wird immer das Zeitdatum enthalten - um die Dokumente zu zitieren, stellt es einen einzigen Zeitpunkt dar und speichert einen Zeitwert seit seinem Referenzdatum (der Start am 1. Januar 2001 bei GMT, wieder nach den Unterlagen). Daher können Sie kein NSDate haben, das die Uhrzeit nicht kennt.

Anstatt zu versuchen, Daten auf Ihre eigene Art zu speichern, würde ich immer noch NSDate in Ihrem Modell verwenden und in Erwägung ziehen, Ihrer Entitätsklasse ein Paar Methoden hinzuzufügen, von denen einer das oben beschriebene durchführt und NSDate auf 00:00 setzt : 00 an einem bestimmten Tag. Der andere könnte nur das Datum von einem NSDate in Ihrem bevorzugten Format zurückgeben. Diese verwenden dann den von Core Data generierten Getter und Setter, um auf die NSDate-Eigenschaft zuzugreifen.

Wenn Sie NSDate weiterhin verwenden, verwenden Sie eine Klasse, mit der Core Data nativ arbeiten kann. Das heißt, Sie können Prädikate problemlos zum Filtern verwenden oder die abgerufenen Ergebnisse nach Datum sortieren, ohne sich darüber Gedanken machen zu müssen.

    
marramgrass 05.08.2009 11:03
quelle

Tags und Links