自定义SQlite函数

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

自定义SQlite函数_第1张图片
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函数_第2张图片

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

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

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

你可能感兴趣的:(自定义SQlite函数)