Хранение чисел широты / долготы высокой точности в основных данных iOS - PullRequest
8 голосов
/ 03 января 2011

Я пытаюсь сохранить широту / долготу в основных данных.В конечном итоге они имеют точность от 6 до 20 цифр.

И по какой-то причине у меня были их как плавающие в Core Data, округляя их и не возвращая мне точные значения.Я попробовал "десятичный" тип, но безуспешно.

Являются ли NSStrings моей единственной альтернативой?

РЕДАКТИРОВАТЬ

NSManagedObject:

@interface Event :  NSManagedObject  
{
}

@property (nonatomic, retain) NSDecimalNumber * dec;
@property (nonatomic, retain) NSDate * timeStamp;
@property (nonatomic, retain) NSNumber * flo;
@property (nonatomic, retain) NSNumber * doub;

Вот код для номера образцачто я храню в основных данных:

NSNumber *n = [NSDecimalNumber decimalNumberWithString:@"-97.12345678901234567890123456789"];

Вышеуказанное значение напечатано.Sweet, значение, которое я ожидал:

Printing description of n:

-97.12345678901234567890123456789

Код для доступа к нему снова:

NSNumber *n = [managedObject valueForKey:@"dec"];
NSNumber *f = [managedObject valueForKey:@"flo"];
NSNumber *d = [managedObject valueForKey:@"doub"];

Печатные значения:

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}

Ответы [ 7 ]

10 голосов
/ 03 января 2011

Использовали ли вы обертку NSNumber?

Настройте свой магазин на использование NSNumber вместо числа с плавающей запятой или десятичной дроби и используйте его для сохранения координат:

[NSNumber numberWithDouble:coordinate.latitude]
//Same for longitude.
1 голос
/ 02 февраля 2013

Когда Core Data хранит данные в SQLite, он использует числовые столбцы. SQLite хранит числа как максимум 8-байтовые значения, целые или с плавающей запятой.Таким образом, хотя NSDecimalNumber был бы весьма рад точно представить эти значения координат, циклическое переключение их через десятичный атрибут Core Data, поддерживаемое SQLite, приведет к их изменению.

1 голос
/ 09 марта 2012

Попробуйте использовать тип данных Double в Core Data.Поскольку ваши координаты местоположения двойные, имеет смысл использовать то же самое в Базовых данных.Хотя это может быть доступно только сейчас (iOS 5).

0 голосов
/ 21 марта 2014

настоятельно рекомендуем использовать NSDecialNumber для хранения, если вам нужно точное значение или сравнение в вашем коде.после сохранения вы можете получить другое значение и получить значение из основных данных в двойных полях.

0 голосов
/ 14 февраля 2012

В редакторе моделей данных убедитесь, что для типов полей lat / long задано значение double.В противном случае CoreData выполнит преобразование за вас, и результат будет не таким, как вы ожидаете (в этом случае десятичные дроби будут отброшены).

0 голосов
/ 27 июня 2011

Я полагаю, что проблема усечения может быть связана с ведением журнала, а не с фактическими данными, хранящимися в Базовых данных.

Можете ли вы подтвердить это, опубликовав код, который вы используете для регистрации выходных данных?

Я говорю это потому, что заметил, что при регистрации некоторых из моих более длинных полей NSString описание базовых данных будет отображать только ~ 50 символов или около того, что может заставить вас думать, что это усечение данных, но на самом деле это просто усечение описанияэтого.

0 голосов
/ 03 января 2011

, поскольку диапазоны координат четко определены, вы можете добавить несколько цифр точности (по сравнению с двойной), используя 64-битное представление типа int (или даже несколько).

на самом деле ваши источники и цели могут не использовать или обеспечивать такую ​​точность, так что ... может быть, вы мало что получите.

...