Вычисление столбцов с использованием базовых данных, таких как SQL - PullRequest
4 голосов
/ 28 августа 2009

Я сортирую магазины, чтобы найти ближайшие магазины. Кроме того, я хочу знать, как далеко находится этот магазин. 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?

Ответы [ 2 ]

3 голосов
/ 28 августа 2009

Сам по себе CoreData не может этого сделать, потому что distanceFromCurrentLocation здесь будет временным свойством (и вы не можете получить временные свойства). Но вы все равно можете сделать это естественным путем, извлекая объекты в NSMutableArray, а затем сортируя этот массив на основе distanceFromCurrentLocation временного свойства.

В зависимости от того, как часто вы делаете это и как часто пользователь перемещается достаточно далеко, чтобы потребовать пересчета, может быть более эффективным иногда пересчитывать постоянное свойство -currentDistance, а затем использовать простые предикаты. Это очень эффективное решение, если вы выполняете поиск гораздо чаще, когда пользователь перемещается, потому что вы можете легко сохранить одну постоянную переменную locationOfLastRecalculation и пересчитывать ее только один раз, когда пользователь перемещается достаточно. Поскольку это будет сохраняться при перезапусках, общее улучшение производительности по сравнению с динамическими вычислениями может быть существенным.

1 голос
/ 28 августа 2009

Из того, что я знаю о Core Data (по крайней мере, ORM), нет способа сделать агрегатные или математические функции такими, как вы пытаетесь. У каждого есть возможность делать предикаты, которые приравниваются к предложению WHERE, но не функции выбора.

Я считаю, что можно обойти Core Data и сделать это в sqlite.

Jack

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...