我正在制作一个应用程序,根据发件人编号在收件箱中搜索邮件。这是我的代码:
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();
请帮帮我....谢谢......
答案 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;
}
我确认此代码按计划运行,欢迎您尝试使用。