7

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

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();

请帮帮我……谢谢……

4

3 回答 3

8

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

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

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

例如 :

LIKE 'B%' 

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

LIKE '%B%'

让你找到所有包含“B”的东西。(如“阿巴”);

LIKE'_B%'

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

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

LIKE '%#_B%' ESCAPE #

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

我希望这有帮助。

Al_th

于 2012-07-27T11:15:02.917 回答
2

尝试以下EDITED

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");
于 2012-07-27T11:27:03.460 回答
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;
        }

我已验证此代码按计划运行,欢迎您试用。

于 2018-01-03T00:06:45.927 回答