如何在SQLite中创建用户定义的函数?

Mus*_*ven 35 sqlite android user-defined-functions

我在android中开发一个应用程序,我需要在sqlite中创建一个udf.是否可以在sqlite中创建它?如果是的话怎么做?

tid*_*all 72

SQLite不像Oracle或MS SQL Server那样支持用户定义的函数.对于SQLite,您必须在C/C++中创建一个回调函数,并使用sqlite3_create_function调用挂起该函数.

不幸的是,Android的SQLite API不允许sqlite3_create_function直接通过Java 进行调用.为了使它工作,您需要使用NDK编译SQLite C库.

如果您仍然感兴趣,请阅读2.3用户定义的函数 ...

以下是如何创建一个查找字符串第一个字节的函数.

static void firstchar(sqlite3_context *context, int argc, sqlite3_value **argv)
{
    if (argc == 1) {
        char *text = sqlite3_value_text(argv[0]);
        if (text && text[0]) {
          char result[2]; 
          result[0] = text[0]; result[1] = '\0';
          sqlite3_result_text(context, result, -1, SQLITE_TRANSIENT);
          return;
        }
    }
    sqlite3_result_null(context);
}
Run Code Online (Sandbox Code Playgroud)

然后将该函数附加到数据库.

sqlite3_create_function(db, "firstchar", 1, SQLITE_UTF8, NULL, &firstchar, NULL, NULL)
Run Code Online (Sandbox Code Playgroud)

最后,在sql语句中使用该函数.

SELECT firstchar(textfield) from table
Run Code Online (Sandbox Code Playgroud)

  • 一个奇妙的简单例子.但是,您选择编写的示例将返回第一个字节,而不是UTF-8字符串的第一个字符,该字符串不一定是有效的Unicode值.如果有人复制这个逐字. (10认同)
  • @jojaba你可以告诉我你在哪里放了`sqlite3_create_function(db,"firstchar",1,SQLITE_UTF8,NULL,&firstchar,NULL,NULL)`语句(在sqlite.c文件中;如果没有,你怎么样?在单独的文件中声明`db`)? (3认同)
  • @Michael 对于我的一个项目......我下载了 NDK,通过 Eclipse 为项目启用了本机支持,添加了 sqlite.c。我将自定义函数添加到与 sqlite.c 不同的 * 单独 * 文件中。尽量不要修改 sqlite.c 文件。请记住,本机 sqlite 库与 Java sqlite 库不同。因此,在本机 C/C++ 代码中定义的任何 sqlite 函数在 Java 中*不*可用。 (2认同)