美文网首页
自定义SQlite函数

自定义SQlite函数

作者: 张智智智智智智 | 来源:发表于2018-01-16 20:20 被阅读0次

    在android源码下开发过数据库的同学应该都看到这样的代码:

    http://androidxref.com/8.0.0_r4/xref/packages/providers/ContactsProvider/src/com/android/providers/contacts/aggregation/ContactAggregator2.java#1028
    这里面的PHONE_NUMBERS_EQUAL(dataA." + Phone.NUMBER + ", " + "dataB." + Phone.NUMBER + ",?)"不知道是什么意思,在SQLite语句中根本就没有见过这样的函数,看不到在哪里有对它的描述,只能通过字面意思猜测是判断号码是否相等的函数,但是不知道具体在哪实现的,搞得是一头雾水。
    其实,这个函数是在源码目录下/external/sqlite/android/sqlite3_android.cpp http://androidxref.com/8.0.0_r4/xref/external/sqlite/android/sqlite3_android.cpp 中实现的,在这里就能看到PHONE_NUMBERS_EQUAL这个函数的具体实现了,那么好奇的同学就会想了:“我想定义一个这样的函数,该如何操作呢?”,其实android已经帮我们把架构搭好了,我们只需要按照它给我们搭好的框架书写就可以了,当然是要在源码下面开发(其实Java也有一套自定义SQLite语句的方法后面再说)。
    如果我们想要自定义一个匹配子串的函数,命名为match_string, SQL 语句中的函数名称我们定义为 "MATCH_STRING",具体步骤如下:
    第一步:
    我们先实现match_string这个函数,这个函数需要在sqlite3_android.cpp 中实现

    第二步:
    上面这个具体方法实现已经写好了,我们需要去sqlite3_android.cpp中register_android_functions方法里面注册一下这个函数

    第三步:
    我们的函数基本上就写完了,我们需要编译一下 external/sqlite,退回到根目录,执行make libsqlite,把编译出来的 libsqlite.so push到手机 /system/lib/ 路径下,重启手机。

    这样就可以在Java中使用这个“MATCH_STRING”自定义函数了,例如:
    Cursor result = query("SELECT * FROM audio WHERE MATCH_STRING(_data, "abc")");

    相关文章

      网友评论

          本文标题:自定义SQlite函数

          本文链接:https://www.haomeiwen.com/subject/vkreoxtx.html