2009-11-08 22 views
5

Anladığım kadarıyla, SQLite, Haversine formülünü düz SQL'de düzgün şekilde uygulamak için matematik işlevlerine sahip değil. Uygulamanın,Haversine formülünün Objective-C'de uygulanması ve SQLite'den çağrılması mümkün müdür?

ile bir external function kullanarak mümkün olabileceğini düşünüyorum. Amaç, iPhone'da bir SQLite veritabanına sahip olmak ve kullanıcının geçerli konumuna olan mesafeye göre sıralama yapabilmek. Arama yaptım, ancak bunun yapıldığına dair bir örnek bulamıyorum. Zor kısımların işlev bildirimlerini doğru olarak alacağını düşünüyorum. Bir C Haversine formüle sahip

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

: Ben, umut ediyorum Sonuçta gibi bir SQL deyimini yürütmek için muktedir olduğunu.

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

herkes bu mümkün olup olmadığını bilmek ve/veya başlamak için bazı örnek kod var mı şu şekildedir: işlev tanımıdır?

cevap

4

Bu, bir dizgi parametresini alan ve bir dize sonucu döndüren bir sqlite işlevini gösterir. Eğer dört yüzen okur ve bir float döndürür ancak prensip aynıdır bir işlev gerekir Senin durumunda

(eğer sqlite3_result_double ile sqlite3_value_double ve sqlite3_result_text ile sqlite3_value_text yerini alacak):

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