35

我正在尝试保存一个位置,然后使用 Core Location、MapKit 和 Core Data 框架在地图上检索该位置。

我所做的只是创建了名为 POI 的实体,并添加了一些属性,例如纬度(双精度型)、经度(双精度型)以及其他一些属性。

简单地说,我的应用程序使用两个 NSNumber 保存 POI。(经纬度)但我觉得必须有比这更聪明的方式来存储 CLLocation。

干杯。

4

5 回答 5

36

你在做什么很好。您应该在核心数据中将纬度和经度保存为双精度值。当您需要再次获取信息时,从 Core Data 中获取双精度数据并构造一个CLLocationCoordinate2D具有类似CLLocationCoordinate2DMake. 没有内置的存储位置的方法,因此存储纬度和经度分量就可以了。

如果您没有对纬度或经度进行任何数学运算(查找边界框等),您可以将它们存储为字符串。浮点数和双精度数可以稍微改变它们的值,使比较操作失败。

于 2010-09-26T09:57:13.307 回答
29

CLLocation 实现了 NSCoding 协议,因此您可以将它们作为可转换属性存储在 Core Data 中。您可以使用默认的 NSKeyedUnarchiveFromData 值转换器。

您只需将 CCLocation 对象传递给托管对象属性,它就会将其序列化为数据并将其作为 blob 存储在 SQL 存储中。当您需要返回位置对象时,它会自动反转该过程并返回给您一个完全填充的 CCLocation 对象。

这可能是得到你想要的最简单的方法。

于 2010-09-26T14:55:53.783 回答
19

存储它的“最佳”方式取决于你想用它做什么:

  • 如果您想要“相同”的 CLLocation,请将其序列化。NSKeyedUnarchiveFromData 很好。
  • 如果您只想搜索纬度和经度,请将它们存储为双精度(并选中“索引”复选框)。

如果您手动操作,您可以保存/恢复许多附加属性(高度、水平精度、垂直精度、时间戳)。还有一些你做不到的(速度、航向);CLLocation 不提供合适的初始化方法并且属性是只读的。

如果您正在录制曲目,所有额外的属性都很有用。如果您在山区记录 POI(“我们仍然必须爬 100 m”),海拔高度很有用。水平/垂直精度可以用来表示 POI 有多大(例如,一个城市可能有几公里的“水平精度”并显示为一个大圆圈)。

于 2010-09-26T15:43:46.717 回答
1

您只需将 Core Data 属性类型设置为Transformable. 如果将Value Transformer Name留空,则默认的转换NSKeyedArchiver器适用于大多数 Foundation 类型,例如 NSURL 和 CLLocation。

于 2015-02-03T16:10:53.470 回答
0

您不需要使用 NSNumber 来存储纬度和经度点。您可以改为将 CLLocation 直接存储到核心数据。

为每个 CLLocation 设置一个实体,无论实体使用位置点,这都会是一个太多的关系。我们称之为 LocationPoint:

class LocationPoint: NSManagedObject {

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

}

然后在 Xcode 数据模型中将location属性设置为可转换的。就是这样!

在 Objective-c 中,您实际上仍然可以将此 LocationPoint 属性声明为 CLLocation 而不会出现任何错误:

@property (nonatomic, strong) CLLocation *location

更多信息在这里

于 2015-10-16T21:35:07.587 回答