2009-11-08 6 views
5

Wie ich verstehe, hat SQLite nicht die mathematischen Funktionen, um die Haversine Formel in geraden SQL richtig zu implementieren. Ich denke, dies sollte möglich sein mit einer external function, mit der Implementierung in C.Ist es möglich, die Haversine-Formel in Objective-C zu implementieren und sie von SQLite aus aufzurufen?

Ziel ist es, eine SQLite-Datenbank in einem iPhone zu haben, und in der Lage, nach der Entfernung zum aktuellen Standort des Benutzers zu sortieren. Ich habe gesucht, aber ich kann kein Beispiel dafür finden. Ich denke, die schwierigen Teile würden die korrekten Funktionserklärungen bekommen. Das Endergebnis für Ich hoffe, in der Lage sein, eine SQL-Anweisung auszuführen:

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

ich eine C Haversine Formel haben. Die Funktionsdefinition ist wie folgt:

Weiß jemand, ob dies möglich ist und/oder haben Sie einen Beispielcode?

Antwort

4

Dies demonstriert eine SQLite-Funktion, die einen String-Parameter akzeptiert und ein String-Ergebnis zurückgibt.

In Ihrem Fall, dass Sie eine Funktion benötigen würde, die vier Schwimmer liest und einen Schwimmer zurückkehrt, aber das Prinzip ist das gleiche (Sie würden sqlite3_value_text mit sqlite3_value_double und sqlite3_result_text mit sqlite3_result_double ersetzen):

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