如何使用Core Data(iPhone)存储CLLocation?

bic*_*bac 34 iphone store core-data save cllocation

我正在尝试使用Core Location,MapKit和Core Data框架保存位置并在地图上检索位置.

我所做的是我刚刚创建了名为POI的实体并添加了诸如纬度(双重类型),经度(双重类型)等属性.

简单地说,我的应用程序使用两个NSNumber保存POI.(lat和long)但我觉得必须有一个更聪明的方法来存储CLLocation.

干杯.

nev*_*ing 35

你做的很好.您应该将核心数据中的纬度和经度保存为双精度数.当您需要再次获取信息时,从Core Data获取双打并构造CLLocationCoordinate2D具有类似函数的结构CLLocationCoordinate2DMake.没有内置的方法来存储位置,因此存储纬度和经度组件很好.

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

  • 呃,不.CLLocation/CLLocationCoordinate2D/CLLocationDegrees使用双精度; 如果您不希望值"更改"*,请将它们保持为双倍*.在double和NSDecimal之间转换*会失去精度.不知何故,人们错误地认为NSDecimal是完美的; 不是.它是十进制浮点而不是二进制浮点. (14认同)
  • @TechZen:这也是我的感受.我在SQLite数据库中使用浮动来映射商店位置,准确性绰绰有余.如果我正在绘制蚯蚓迁移图,我可能会使用更准确的东西. (3认同)
  • 如果你正在对它们进行一些计算,比如找到大于12.34的所有纬度,我会将它们存储为浮点数或双精度数.只是不要依赖浮点值在存储它和获取它之间完全相同.如果要确保值不会改变(即使只是一小部分),请使用小数.我只是不确定用十进制类型做数学的速度有多快.这是一个链接:http://stackoverflow.com/questions/159255/what-is-the-ideal-data-type-to-use-when-storing-latitude-longitudes-in-a-mysql/159333#159333 (2认同)
  • 如果需要以极高的精度存储数值并对它们执行操作,则应使用NSDecimal数.使用值转换器将它们存储在Core Data中.但是,我认为在这种情况下这样做会有些过分.浮点数和双打数可以改变值,但仅限于其精度的极端值.纬度/经度仅需要最多4个小数位,因此您可以简单地控制有效数字,以便使用浮点数完美地存储和检索这些值. (2认同)

Tec*_*Zen 27

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

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

这可能是获得你想要的最简单方法.

  • 如果数据已序列化,则无法从商店中获取每个位置,您将无法获取边界框内的位置. (14认同)

tc.*_*tc. 17

存储它的"最佳"方式取决于您想要用它做什么:

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

如果手动执行此操作,可以保存/恢复一些其他属性(海拔高度,水平精度,垂直精度,时间戳).还有一些你不能(速度,标题); CLLocation不提供合适的init方法,并且属性是只读的.

如果您正在录制曲目,则所有额外属性都很有用.如果您在山区地形上记录POI("我们仍然需要攀爬100米"),海拔高度非常有用.水平/垂直精度可用于表示POI的大小(例如,城市可能具有几公里的"水平精度"并显示为大圆).