【问题标题】:Calculating columns with Core Data like SQL使用 SQL 等核心数据计算列
【发布时间】:2009-08-28 13:35:59
【问题描述】:

我正在对商店进行排序以获取最近的商店。 此外,我想知道这家商店有多远。 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 使用 Core Data 实现这一点?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      我相信可以绕过 Core Data 并在 sqlite 中做到这一点。

      杰克

      【讨论】:

      • 其实不能,因为sqlite没有必要的trig函数。但是,请参阅 thismuchiknow.co.uk/?p=71。这是向 sqlite 添加一个自定义 C 函数,它允许它计算距离并用于 SELECT 查询。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-01
      • 1970-01-01
      相关资源
      最近更新 更多