代码之家  ›  专栏  ›  技术社区  ›  jantimon

使用SQL等核心数据计算列

  •  4
  • jantimon  · 技术社区  · 17 年前

    我正在对商店进行分类,以找到最近的商店。

    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实现这一点?

    2 回复  |  直到 17 年前
        1
  •  3
  •   Rob Napier    17 年前

    CoreData本身无法做到这一点,因为 distanceFromCurrentLocation 这将是一个瞬态属性(您无法获取瞬态属性)。但是,您仍然可以通过将对象提取到NSMutableArray中,然后根据 与当前位置的距离 瞬态属性。

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

        2
  •  1
  •   Jack Cox    17 年前

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

    我相信可以绕过核心数据,在sqlite中做到这一点。

    杰克