Iphone 是否可以在Objective-C中实现Haversine公式并从SQLite调用它?

Iphone 是否可以在Objective-C中实现Haversine公式并从SQLite调用它?,iphone,objective-c,sqlite,haversine,great-circle,Iphone,Objective C,Sqlite,Haversine,Great Circle,据我所知,SQLite没有数学函数来在纯SQL中正确实现公式。我认为这应该是可能的使用,与实现是在C 我们的目标是在iPhone中有一个SQLite数据库,并且能够根据到用户当前位置的距离进行排序。我已经搜索过了,但是我找不到这样做的例子。我认为最困难的部分将是正确地获取函数声明。我希望的最终结果是能够执行如下SQL语句: SELECT * FROM LOCATION loc ORDER BY distance(loc.lat, loc.long, ?, ?) 我有一个哈弗森公式。函数定义如下

据我所知,SQLite没有数学函数来在纯SQL中正确实现公式。我认为这应该是可能的使用,与实现是在C

我们的目标是在iPhone中有一个SQLite数据库,并且能够根据到用户当前位置的距离进行排序。我已经搜索过了,但是我找不到这样做的例子。我认为最困难的部分将是正确地获取函数声明。我希望的最终结果是能够执行如下SQL语句:

SELECT * FROM LOCATION loc ORDER BY distance(loc.lat, loc.long, ?, ?)
我有一个哈弗森公式。函数定义如下:

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

有人知道这是否可行,并且/或者有一些示例代码可以开始吗?

这演示了一个sqlite函数,它接受一个字符串参数并返回字符串结果

在您的情况下,您需要一个读取四个浮点并返回一个浮点的函数,但原理相同(您将用sqlite3_值_双精度替换sqlite3_值_文本,用sqlite3_结果_双精度替换sqlite3_结果_文本):

#包括
#包括
#包括
void haver(sqlite3_上下文*ctx,int cnt,sqlite3_值**val)
{
printf(“在SQLite haver实现中,调用值:%s\n”,sqlite3_value_text(*val));
char*resultOfCall=“函数调用的结果”;//这将调用距离函数
sqlite3_结果_文本(ctx、resultOfCall、strlen(resultOfCall)、NULL);
}
int cback(void*udata,int ncol,char**value,char**colname)
{
int i=0;

对于(;我我刚刚在这篇文章中获得了好运:

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