自定义SQlite函数

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

《自定义SQlite函数》 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 中实现

《自定义SQlite函数》

第二步:

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

《自定义SQlite函数》

第三步:

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

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

    原文作者:张智智智智智智
    原文地址: https://www.jianshu.com/p/c0a1e27cd563
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞