2009-11-08 5 views
5

जैसा कि मैं समझता हूं, SQLite में सीधे SQL में Haversine सूत्र को लागू करने के लिए गणित कार्य नहीं हैं। मैं सोच रहा हूं कि external function का उपयोग करके यह संभव होना चाहिए, सीक्या उद्देश्य-सी में हावरसिन फॉर्मूला को कार्यान्वित करना संभव है और इसे SQLite से कॉल करें?

लक्ष्य का लक्ष्य एक आईफोन में SQLite डेटाबेस होना है, और उपयोगकर्ता के वर्तमान स्थान की दूरी से क्रमबद्ध करने में सक्षम होना चाहिए। मैंने खोज की है, लेकिन मुझे ऐसा होने के किसी भी उदाहरण का उदाहरण नहीं मिल रहा है। मुझे लगता है कि मुश्किल हिस्सों में समारोह घोषणाएं सही हो रही हैं।

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

मैं एक सी Haversine सूत्र है: अंतिम परिणाम मैं, के लिए आशा करती हूं कि जैसे किसी SQL बयान निष्पादित करने के लिए सक्षम होने के लिए है। फ़ंक्शन परिभाषा निम्नानुसार है:

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

क्या किसी को पता है कि यह संभव है और/या कुछ उदाहरण कोड शुरू करने के लिए है?

उत्तर

4

यह एक स्क्लिट फ़ंक्शन दिखाता है जो एक स्ट्रिंग पैरामीटर में होता है और एक स्ट्रिंग परिणाम देता है।

अपने मामले में आप एक समारोह है कि चार तैरता पढ़ता है और एक नाव देता है लेकिन सिद्धांत एक ही है की आवश्यकता होगी (आप sqlite3_value_text साथ sqlite3_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); 
} 
संबंधित मुद्दे

 संबंधित मुद्दे