2009-11-08 5 views
5

제가 알고 있듯이 SQLite에는 Haversine 수식을 SQL을 올바르게 구현하는 수학 함수가 없습니다. 나는 external function을 사용하여 구현이 C로되어 있다고 생각하고있다.Objective-C에서 Haversine 수식을 구현하고 SQLite에서 호출 할 수 있습니까?

목표는 iPhone에 SQLite 데이터베이스를두고 사용자의 현재 위치까지 거리별로 정렬 할 수 있도록하는 것이다. 나는 수색했지만,이 모든 일의 예를 찾을 수는 없습니다. 난 어려운 부분은 함수 선언을 올바른 것으로 생각합니다. 최종 결과는 다음과 같은 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

방금이 게시물에 행운을 빕니다.

4

이것은 하나의 문자열 매개 변수를 받아 문자열 결과를 반환하는 sqlite 함수를 보여줍니다. 네 개의 수레를 읽고 float를 반환하지만 원칙은 동일 기능을 필요 귀하의 경우에는

(당신은 sqlite3_result_doublesqlite3_value_doublesqlite3_result_textsqlite3_value_text를 대체 할) :

#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); 
}