最近在看短信搜索功能,发现 MmsSmsProvider.java 中的SQL语句不能很好的搜索现象,不知道是什么原因,部分代码:String searchString = uri.getQueryParameter("pattern");
                String query = String.format("SELECT _id, index_text, source_id, table_to_use, offsets(words) FROM words WHERE words MATCH '%s*' LIMIT 50;", searchString);
               if (       sortOrder != null
                        || selection != null
                        || selectionArgs != null
                        || projection != null) {
                    throw new IllegalArgumentException(
                            "do not specify sortOrder, selection, selectionArgs, or projection" +
                             "with this query");
                 }                cursor = db.rawQuery(query, null);
执行这条SQL语句,如果短信内容是:“短信信息搜索”,只有输入“短信”才能查到结果,输入“信息”却查不到结果,也就是说输入第一个字符串才能查到,而且我把query中的‘%s*'改为‘%s‘,却导致什么都查不出来,不知何解?期待大牛现身!!!

解决方案 »

  1.   

    仔细看一下,searchString将会替代%s的内容,后面的*是通配符,可以匹配任意内容,%S*的意思是匹配以searchString为开头的所有短信,所以你输入信息是查不到的。你去掉了*,就是说只能搜索到于searchString一模一样的信息了。不知到我说明白没有啊?
      

  2.   

    嗯,%S*应该表示在该表中查找以searchString开头的字符串吧,与searchString所在的位置没有关系把,而%S应该是说查找表中是否含有searchString字符串,并不是要以searchString开头吧。这是我的理解,那
    我想问下,如果表中有这样一条语句"This is a table", SELECT _id FROM words WHERE words MATCH 'tab*',是否有结果呢?
      

  3.   

    %S*就是查找一%S为开头的字符串,如果要查找还有%S的字符串应该是:*%S*这样的啦
      

  4.   

    ‘tab*’的意思是查询前三个字母是tab的字符串,*匹配任何字符
      

  5.   

    对于*%s*我以前也是以为可以这样写的,我也这样写了结果什么都查不到,因为这个是sqlite数据库有点不同,后面查了相关资料没有*%s*这样的写法,你可以也可以去查查看阿。
      

  6.   

    ...我还按一般的数据库理解呢,原来是android数据库对中文有bug啊
      

  7.   


    这个个人认为是sqlite对中文没有很好的支持,后面这个Bug我没有解了,好像很多机器上都有这个问题,你有空可以研究下~~