2009-11-08 9 views
5

Jak rozumiem, SQLite nie ma funkcji matematycznych, aby poprawnie wdrożyć formułę Haversine w prostym SQL. Myślę, że powinno to być możliwe przy użyciu external function, z implementacją będącą w C.Czy można wdrożyć formułę Haversine w Objective-C i wywołać ją z SQLite?

Celem jest posiadanie bazy danych SQLite w telefonie iPhone oraz sortowanie według odległości od aktualnej lokalizacji użytkownika. Szukałem, ale nie mogę znaleźć przykładu jakichkolwiek przykładów tego. Myślę, że trudnymi częściami byłyby poprawne deklaracje funkcji. Końcowym rezultatem mam nadzieję, jest w stanie wykonać instrukcję SQL, takich jak:

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

mam formułę C Haversine. Definicja funkcji wygląda następująco:

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

Czy ktoś wie, czy jest to możliwe i/lub ma przykładowy kod, od którego można zacząć?

Odpowiedz

4

To demonstruje funkcję sqlite, która przyjmuje jeden parametr ciągu i zwraca wynik ciągu.

W twoim przypadku będzie trzeba funkcję, która odczytuje czterech pływaków i zwraca pływaka, ale zasada jest taka sama (by wymienić sqlite3_value_text z sqlite3_value_double i sqlite3_result_text z 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); 
} 
Powiązane problemy