IOS / Objective-C: расположение хранилища из служб определения местоположения в основных данных [дубликат]

Это зависит от ОС. Если ваша ОС понимает, вы можете просто отправить ее UTF-8.

33
задан bicbac 26 September 2010 в 10:03
поделиться

5 ответов

То, что вы делаете, прекрасно. Вы должны сохранить широту и долготу как удвоившиеся в Core Data. Когда вам нужно снова получить информацию, верните двойники из Core Data и создайте структуру CLLocationCoordinate2D с функцией, подобной CLLocationCoordinate2DMake. Нет встроенного способа хранения местоположения, поэтому хранение компонентов широты и долготы в порядке.

Если вы не выполняете математические операции по широте или долготе (поиск ограничивающих полей и т. Д.), Вы можете сохранить их как строки. Поплавки и удвоения могут слегка изменить свои значения, что приведет к сбоям сравнения.

35
ответ дан nevan king 21 August 2018 в 05:09
поделиться
  • 1
    Спасибо nevan, на самом деле я сохранил эти значения координат в NSString, а также для отображения в UILabel. У меня есть план сделать математику с координатами, но я не знал, что & quot; Поплавки и удвоения могут слегка изменять свои значения, что приводит к сбоям сравнения. & Quot; что заставляет меня вернуться к первоначальному вопросу с небольшими изменениями; Если вам нужно рассчитать расстояние и сравнить, что является лучшим способом хранения значений координат CLLocation с использованием Core Data? – bicbac 26 September 2010 в 11:22
  • 2
    Если вы делаете некоторые вычисления на них, например, чтобы найти все широты более 12,34, я бы сохранил их как поплавки или парные. Просто не полагайтесь на то, что значение float совпадает с сохранением и извлечением. Если вы хотите удостовериться, что значение не изменяется (даже маленькой фракцией), используйте десятичное значение. Я просто не знаю, как быстро это сделать математику с десятичными типами. Вот ссылка: stackoverflow.com/questions/159255/… – nevan king 26 September 2010 в 13:52
  • 3
    Если вам нужно хранить числовые значения с большой точностью и выполнять операции над ними, вы должны использовать NSDecimal number. Используйте трансформатор значений для их хранения в Core Data. Однако я думаю, что в этом случае это будет излишним. Поплавки и удвоения могут изменять значения, но только в крайних точках их точности. Широта / Долгота требует всего 4 десятичных знака справа, чтобы вы могли просто контролировать свои значащие цифры, чтобы идеально хранить и извлекать эти значения с помощью поплавков. – TechZen 26 September 2010 в 15:50
  • 4
    @TechZen: Это тоже мое чувство. Я использую float в базе данных SQLite для сопоставления позиций магазина, и для этого более чем достаточно. Если бы я собирал миграцию земляных червей, я мог бы использовать что-то более точное. – nevan king 26 September 2010 в 16:00
  • 5
    Нет, нет. CLLocation / CLLocationCoordinate2D / CLLocationDegrees используют удвоения; если вы не хотите, чтобы значения изменялись & quot; , то сохраните их как удвоенные . Преобразование между двойными и NSDecimal делает теряет точность. Почему-то люди ошибаются, что NSDecimal совершенен; это не. Это десятичная плавающая точка вместо двоичной с плавающей запятой. – tc. 26 September 2010 в 16:32

Вы можете сделать это очень просто, установив тип атрибута Core Data на Transformable. Трансформатор по умолчанию, если вы оставите пустое значение Value Transformer Name пустым NSKeyedArchiver, который работает с большинством типов Foundation, таких как NSURL и CLLocation.

2
ответ дан Chris Morse 21 August 2018 в 05:09
поделиться

Вам не нужно использовать NSNumber для хранения точек широты и долготы. Вместо этого вы можете хранить CLLocation непосредственно в основных данных.

Настройте сущность для каждого CLLocation, это будет слишком много отношений, независимо от того, какой объект использует точки местоположения. Давайте назовем это LocationPoint:

class LocationPoint: NSManagedObject {

@NSManaged var game: NSNumber
@NSManaged var time: NSDate
@NSManaged var location: AnyObject

}

Затем вы установите свойство location для преобразования в модель данных Xcode. Вот и все!

В Objective-c вы действительно можете объявить это свойство LocationPoint как CLLocation без каких-либо ошибок:

@property (nonatomic, strong) CLLocation *location

Подробнее здесь .

0
ответ дан PostCodeism 21 August 2018 в 05:09
поделиться

«Лучший» способ сохранить его зависит от того, что вы хотите с ним делать:

  • Если вы хотите «же» CLLocation, сериализуйте его. NSKeyedUnarchiveFromData в порядке.
  • Если вы просто хотите искать по широте и долготе, сохраните их как парные (и установите флажок «индексированный»).

кучу дополнительных свойств, которые вы можете сохранить / восстановить, если вы сделаете это вручную (высота, горизонтальная точность, вертикальная точность, метка времени). Есть еще кое-что, что вы не можете (скорость, заголовок); CLLocation не предоставляет подходящий init-метод, и свойства доступны только для чтения.

Все дополнительные свойства полезны, если вы записываете дорожку. Высота важна, если вы записываете POI на горной местности («нам еще нужно подняться на 100 м»). горизонтальная / вертикальная точность может использоваться для представления того, насколько велика POI (например, город может иметь «горизонтальную точность» в несколько километров и отображаться как большой круг).

17
ответ дан tc. 21 August 2018 в 05:09
поделиться

CLLocation реализует протокол NSCoding, поэтому вы можете хранить их в Core Data в качестве преобразуемых атрибутов. Вы можете использовать стандартный трансформатор значений NSKeyedUnarchiveFromData.

Вы просто передали бы объект CCLocation в атрибут управляемого объекта, и он сериализовал его на данные и сохранил бы его как blob в хранилище SQL. Когда вам понадобится объект местоположения, он автоматически изменит процесс и вернет вам полностью заполненный объект CCLocation.

Это может быть самый простой способ получить то, что вы хотите.

27
ответ дан TechZen 21 August 2018 в 05:09
поделиться
  • 1
    Если данные сериализованы, вы не сможете получить места в ограничительной рамке, не получая каждое местоположение из магазина. – nevan king 26 September 2010 в 16:06
  • 2
    может быть легко, но не может запрашивать при сохранении в этом формате. – malhal 31 December 2015 в 02:15
Другие вопросы по тегам:

Похожие вопросы: