Die Speicherung von hochpräzisen Längen-und Breitengrad zahlen, die in iOS, Core Data
Ich versuche zu speichern Breiten - /Längengrade in core data. Diese sind am Ende überall von 6-20 stelliger Präzision.
Und aus welchem Grund auch immer, hatte ich als Schwimmer in der Core-Daten, deren Rundung Sie und nicht dass Sie mir die genauen Werte wieder. Ich habe versucht, "dezimal" geben, mit der kein Glück entweder.
Sind NSStrings meine einzige andere option?
BEARBEITEN
NSManagedObject:
@interface Event : NSManagedObject
{
}
@property (nonatomic, retain) NSDecimalNumber * dec;
@property (nonatomic, retain) NSDate * timeStamp;
@property (nonatomic, retain) NSNumber * flo;
@property (nonatomic, retain) NSNumber * doub;
Hier ist der code für eine Probe-Nummer, die ich speichern in Kern-Daten:
NSNumber *n = [NSDecimalNumber decimalNumberWithString:@"-97.12345678901234567890123456789"];
Den oben genannten Wert gedruckt. Süß, Wert, den ich erwartet:
Printing description of n:
-97.12345678901234567890123456789
Code erneuten Zugriff:
NSNumber *n = [managedObject valueForKey:@"dec"];
NSNumber *f = [managedObject valueForKey:@"flo"];
NSNumber *d = [managedObject valueForKey:@"doub"];
Gedruckte Werte:
Printing description of n:
-97.1234567890124
Printing description of f:
<CFNumber 0x603f250 [0xfef3e0]>{value = -97.12345678901235146441, type = kCFNumberFloat64Type}
Printing description of d:
<CFNumber 0x6040310 [0xfef3e0]>{value = -97.12345678901235146441, type = kCFNumberFloat64Type}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie das NSNumber-wrapper?
Konfigurieren Sie Ihr Geschäft zu verwenden, NSNumber, anstelle von float oder decimal, und verwenden Sie diese zum speichern der Koordinaten:
Versucht, mit Hilfe der Double-Datentyp in Core Data. Seit Ihrem Standort-Koordinaten werden verdoppelt, macht Sinn, das gleiche in Core Data. Obwohl, die verfügbar sein können gerade jetzt (iOS 5).
Wenn Core Data speichert die Daten im SQLite, es verwendet die numerischen Spalten. SQLite speichert zahlen wie--höchstens--8-byte-Werte, egal ob integer oder floating-point. So, während ein
NSDecimalNumber
wäre sehr glücklich, um genau zu repräsentieren diese Werte in einem Koordinatensystem, das " round-tripping Sie durch ein Core Data decimal Attribut unterstützt von SQLite wird munge Sie.seit koordinieren die Bereiche sind klar definiert, können Sie ein paar Ziffern der Genauigkeit (im Vergleich zu Doppel -) durch die Verwendung eines 64-bit-int-Darstellung (oder sogar mehrere).
in der Realität, Ihre Quellen und Ziele, die nicht können oder bieten diese viel Genauigkeit so... kann es nicht viel zu gewinnen ist.
decimalValue
. ich sehe nichts in der Dokumentation, die sagt, der Wert kann abgeschnitten werden, wenn Sie archiviert werden. als sanity-check: definieren Sie die CD-Attribut als Dezimalzahl, sondern als eine andere numerische Repräsentation? offensichtlich, aber dies ist ein Weg zur Einführung der Kürzung.Ich glaube, dass die Kürzung problem sein könnte, auf die Anmeldung, nicht auf den eigentlichen gespeicherten Daten in Core Data.
Können Sie bestätigen, dass durch die Veröffentlichung der code, den Sie verwenden, um log die Ausgabe?
Ich sage dies, weil ich bemerkt habe, dass bei der Anmeldung einige meiner mehr NSString Felder, Kern-Daten-Beschreibung wird nur angezeigt ~50 Zeichen oder so, das könnte dazu führen, dass Sie denken, es ist das abschneiden der Daten, aber es ist eigentlich nur das abschneiden der Beschreibung.
In Ihrem data-Modell-editor, stellen Sie sicher, dass die Typen für Ihre lat/long-Felder gesetzt zu
double
. Ansonsten CoreData wird die Konvertierung für Sie tun, und das Ergebnis wird nicht das, was Sie erwarten (in diesem Fall die Nachkommastellen werden fallen gelassen).empfehlen dringend die Verwendung NSDecialNumber für die Speicherung, wenn Sie brauchen genaue Wert oder vergleichen, die in Ihrem code. Sie haben möglicherweise eine andere Wert nach Speicher und Wert von Stammdaten in Doppel-Felder.