5

私が理解しているように、SQLite には、単純な SQL でHaversine式を適切に実装するための数学関数がありません。これは、C言語で実装された外部関数を使用して可能になるはずだと考えています.

目標は、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

2 に答える 2

4

この投稿で幸運を祈りました: http://www.thismuchiknow.co.uk/?p=71

于 2010-01-16T21:30:52.073 に答える
4

これは、1 つの文字列パラメーターを受け取り、文字列の結果を返す sqlite 関数を示しています。

あなたの場合、4 つの float を読み取り、float を返す関数が必要になりますが、原則は同じです ( sqlite3_value_textsqlite3_value_doubleに、sqlite3_result_textsqlite3_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);
}
于 2009-11-08T10:55:09.887 に答える