2009-11-08 12 views
5

Según tengo entendido, SQLite no tiene las funciones matemáticas para implementar correctamente la fórmula Haversine en SQL directo. Estoy pensando que esto debería ser posible usando un external function, con la implementación en C.¿Es posible implementar la fórmula Haversine en Objective-C y llamarla desde SQLite?

El objetivo es tener una base de datos SQLite en un iPhone, y poder ordenar por la distancia a la ubicación actual del usuario. He buscado, pero no puedo encontrar un ejemplo de ningún ejemplo de esto. Creo que las partes difíciles obtendrían las declaraciones de funciones correctas. El resultado final que estoy esperando, es ser capaz de ejecutar una instrucción SQL como:

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

tengo una fórmula C Haversine. La definición de la función es la siguiente:

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

¿Alguien sabe si esto es posible y/o tiene algún código de ejemplo para comenzar?

Respuesta

4

Esto demuestra una función sqlite que toma en un parámetro de cadena y devuelve un resultado de cadena.

En su caso se necesitaría una función que lee cuatro flotadores y devuelve un flotador, pero el principio es el mismo (debería reemplazar sqlite3_value_text con sqlite3_value_double y sqlite3_result_text con 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); 
} 
Cuestiones relacionadas