2009-11-08 6 views
5

Как я понимаю, SQLite не имеет математических функций для правильной реализации формулы Haversine в прямом SQL. Я думаю, что это должно быть возможно, используя external function, причем реализация выполнена в C.Возможно ли реализовать формулу Хаверсина в Objective-C и вызвать ее из SQLite?

Целью является наличие базы данных SQLite в iPhone и возможность сортировки по расстоянию до текущего местоположения пользователя. Я искал, но я не могу найти пример каких-либо примеров этого. Я думаю, что трудные части будут получать правильные объявления функций. В конечном итоге я надеюсь, должен быть в состоянии выполнить SQL заявление, как:

SELECT * FROM LOCATION loc ORDER BY distance(loc.lat, loc.long, ?, ?) 

У меня есть формула C Haversine. Определение функции выглядит следующим образом:

float distance(float nLat1, float nLon1, float nLat2, float nLon2); 

Кто-нибудь знает, возможно ли это и/или есть какой-то пример кода для начала?

ответ

4

Это демонстрирует функцию sqlite, которая принимает один строковый параметр и возвращает результат строки.

В вашем случае вам потребуется функция, которая считывает четыре поплавки и возвращает поплавок, но принцип тот же (вы должны заменить sqlite3_value_text с sqlite3_value_double и sqlite3_result_text с sqlite3_result_double):

#include <stdlib.h> 
#include <sqlite3.h> 
#include <stdio.h> 


void haver(sqlite3_context* ctx,int cnt,sqlite3_value** val) 
{ 
    printf("In SQLite haver implementation, called for value: %s\n", sqlite3_value_text(*val)); 

    char * resultOfCall = "Result of function call"; //this would call the distance function 
    sqlite3_result_text(ctx, resultOfCall, strlen(resultOfCall), NULL); 
} 
int cback (void* udata,int ncol,char** value,char** colname) 
{ 
    int i=0; 
    for(;i<ncol;i++) 
    printf("Result column: %s value: %s \n", colname[i], value[i]); 
    return 0; 
} 
int main() 
{ 

    sqlite3 * handle; 
    int res = sqlite3_open("./test.sql", &handle); 

    res = sqlite3_create_function(handle, "haver", 1, SQLITE_UTF8, NULL, &haver, NULL, NULL); 

    char * errmsg = NULL; 
    res = sqlite3_exec(handle, "select haver(w) from t", &cback, NULL, &errmsg); 
    printf("sqlite3_exec result: %d %s\n", res, errmsg != NULL ? errmsg : "No error"); 

    sqlite3_close(handle); 
}