Iphone 使用核心数据(如SQL)计算列

Iphone 使用核心数据(如SQL)计算列,iphone,objective-c,cocoa,cocoa-touch,core-data,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((RADIA

我正在对商店进行分类,以获得最近的商店。 此外,我想知道这家商店有多远。 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
这些问号将被用户位置的经度和纬度所取代。 (纬度,纬度,经度,纬度,纬度,经度)


如何使用iPhone SDK使用核心数据实现这一点?

根据我对核心数据(至少是ORM)部分的了解,没有一种方法可以像您正在尝试的那样执行聚合函数或数学函数。一个人可以做等同于WHERE子句的谓词,但不能做选择函数

我相信可以绕过核心数据,在sqlite中这样做


Jack

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


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

事实上,您不能这样做,因为sqlite没有必要的触发函数。但是,请参见。这是在sqlite中添加一个自定义C函数,它允许它计算距离并在SELECT查询中使用。