使用Core Data(如SQL)计算列

时间:2009-08-28 13:35:59

标签: iphone objective-c cocoa cocoa-touch core-data

我正在整理商店以获得最近的商店。 此外,我想知道这家商店有多远。 SQL查询看起来像这样:

select *,

6371 * 2 * ATAN2(SQRT(POWER(SIN((RADIANS(?) - RADIANS(latitude))/2),2) + COS(RADIANS(latitude)) * COS(RADIANS(?)) * POWER(SIN((RADIANS(?) - RADIANS(longitude))/2),2)), SQRT(1-POWER(SIN((RADIANS(?) - RADIANS(latitude))/2),2) + COS(RADIANS(latitude)) * COS(RADIANS(?)) * POWER(SIN((RADIANS(?) - RADIANS(longitude))/2),2))) AS DISTANCE

FROM stores
ORDER BY DISTANCE

这些问号将被用户位置的经度和纬度所取代。 (纬度,纬度,经度,纬度,纬度,经度)

如何使用Core Data使用iPhone SDK实现这一目标?

2 个答案:

答案 0 :(得分:3)

CoreData本身不能真正做到这一点,因为distanceFromCurrentLocation这里将是一个瞬态属性(并且你无法获取瞬态属性)。但是,您仍然可以通过将对象提取到NSMutableArray中,然后基于distanceFromCurrentLocation瞬态属性对该数组进行排序,以自然的方式执行此操作。

根据您执行此操作的频率以及用户移动到需要重新计算的频率,有时可能更有效地重新计算-currentDistance持久属性,然后使用简单谓词。如果您经常搜索用户移动,这是一种非常有效的解决方案,因为您可以轻松保留单个locationOfLastRecalculation持久变量,并且只有在用户充分移动时才重新计算一次。由于这会在重新启动后持续存在,因此与动态计算相比整体性能提升可能会很大。

答案 1 :(得分:1)

据我所知,核心数据(至少是ORM)的一部分,没有办法像你正在尝试的那样进行聚合函数或数学函数。一个人能够执行等同于WHERE子句的谓词,但不能选择函数。

我相信可以绕过Core Data并在sqlite中执行此操作。

杰克