如何在查询函数中使用LIKE子句

时间:2012-07-27 11:03:46

标签: android sqlite

我正在制作一个应用程序,根据发件人编号在收件箱中搜索邮件。这是我的代码:

public void onClick(View v)
{
    Toast.makeText(this, "search", Toast.LENGTH_LONG).show();
    final Uri SMS_INBOX = Uri.parse("content://sms/inbox");

    String[] colList = {"address", "body"};

    Cursor c = getContentResolver().query(SMS_INBOX, colList, null, null,"DATE desc");

    String yz= String.valueOf(c.getCount());
    Toast.makeText(this, yz, Toast.LENGTH_LONG).show();

    if(c.moveToFirst())
    {
        Toast.makeText(this, searchtxt.getText(), Toast.LENGTH_LONG).show();

        for(int i=0;i<c.getCount();i++)
        {
            String number=c.getString(c.getColumnIndexOrThrow("address")).toString();
            boolean match = number.toUpperCase().indexOf(searchtxt.getText().toString()) != -1; 

            if (match)
            {
                Toast.makeText(this, String.valueOf(i), Toast.LENGTH_LONG).show();
                String  body= c.getString(c.getColumnIndexOrThrow("body")).toString();
                tv.setText(tv.getText() + "\n" + body);
            }
            c.moveToNext();
        }
    }
    else
    {
        Toast.makeText(this, "Inside else", Toast.LENGTH_LONG).show();
    }

    c.close();
}

上面的代码工作正常,但它会检索收件箱中的所有邮件。我希望它应该只检索那些与发件人号码匹配的邮件。为此,我尝试使用LIKE子句进行查询,但是使用它返回0条记录。使用LIKE子句的正确方法是什么。这是我尝试使用LIKE

的代码
String[] colList = {"address", "body"};
String[] argList = {"'%"+searchtxt.getText().toString()+"%'"};
Cursor c = getContentResolver().query(SMS_INBOX, colList, "address LIKE ?", argList,"DATE desc");

String yz= String.valueOf(c.getCount());
Toast.makeText(this, yz, Toast.LENGTH_LONG).show();

请帮帮我....谢谢......

3 个答案:

答案 0 :(得分:7)

有两个小丑:“%”和“_”。

“%”正在替换任何字符串(多个字符),

“_”正在替换一个(且只有一个)字符。

例如:

LIKE 'B%' 

让你找到以“B”开头的所有内容。 (比如“蝙蝠侠”);

LIKE '%B%'

让你找到包含“B”的外翻。 (比如“ABBA”);

LIKE'_B%'

让你找到包含一个字符的所有内容,然后是“B”。 (如“ABERCROMBIE”)。

如果要检索包含“%”或“_”的字符串,可以使用转义字符:

LIKE '%#_B%' ESCAPE #

让您找到包含一个“_”后跟“B”的任何字符串。 (比如“TEST_BATMAN”)。

我希望有所帮助。

Al_th

答案 1 :(得分:2)

尝试以下已编辑

String[] argList = {"'%%%%"+searchtxt.getText().toString()+"%%%%'"};//TRY  THIS
                      ^^^^                                  ^^^^  // TRY THIS

Uri smsUri = Uri.parse("content://sms/inbox");
Cursor c = getContentResolver().query(smsUri, colList, "address LIKE ?", argList, "DATE");

答案 2 :(得分:0)

我的代码中也出现了这个问题,我花了一些时间才找到正确的答案。 对我来说有用的是@Arushi gupta在回复中所写的内容。

这是我的工作代码,经过调整后,用户可以执行EXACT搜索查询或搜索包含查询中单词的值(AND运算符或OR运算符)。我的代码使用CursorLoader,但它与在此示例中使用ContentResolver相同:

String selection = myDbContract.myDbEntry.getSelectionForGivenKeywordsAndOperator(requested_keyword, "OR"); //Can write "EXACT" / "AND" / "OR"
return new CursorLoader(this, myQueryUri, MY_TABLE_ELEMENTS, selection, null, null);

以下是dB合约中的选择方法:

        public static String getSelectionForGivenKeywordsAndOperator(String keyword_list, String operator) {

            String returnSQLCommand = null;
            if(keyword_list.length()==0) return returnSQLCommand;

            switch (operator) {
                case "EXACT":
                    returnSQLCommand = COLUMN_KEYWORD + "='" + keyword_list + "'";
                    break;
                default: //operator is "AND" or "OR"
                    List<String> keywords = new ArrayList<>();
                    if (keyword_list.contains(" ")) keywords = Arrays.asList(keyword_list.split(" "));
                    else if (keyword_list.contains(",")) keywords = Arrays.asList(keyword_list.split(","));
                    else if (keyword_list.contains(";")) keywords = Arrays.asList(keyword_list.split(";"));
                    else if (keyword_list.contains(".")) keywords = Arrays.asList(keyword_list.split("."));
                    else keywords.add(keyword_list);

                    returnSQLCommand = "'%" + keywords.get(0) + "%'";
                    if (keywords.size()>=1) {
                        returnSQLCommand = COLUMN_KEYWORD + " LIKE '%" + keywords.get(0) + "%'";
                        for (int i = 1; i < keywords.size(); i++) {
                            returnSQLCommand = returnSQLCommand + " " + operator + " " + COLUMN_KEYWORD + " LIKE '%" + keywords.get(i) + "%'";
                        }
                    }
                    break;
            }
            return returnSQLCommand;
        }

我确认此代码按计划运行,欢迎您尝试使用。