2012-07-27 115 views
6

我正在制作一个应用程序,它根据发件人编号在收件箱中搜索邮件。这是我的代码:如何在查询函数中使用LIKE子句

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子句的正确方法。下面是我使用像

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

也许你应该使用ILIKE,这使查询大小写不敏感 – Alptugay 2012-07-27 11:07:14

+0

Thanx Alptugay ....但它的功能.. – 2012-07-27 17:07:14

回答

7

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

“%” 是置换任何字符串(多个字符),

“_” 正在取代一个(并且只有一个)的字符。

例如:

LIKE 'B%' 

让你找到与 “B” 开头的一切。 (如“蝙蝠侠”);

LIKE '%B%' 

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

LIKE'_B%' 

让你找到所有包含一个caracter然后一个“B”。 (如“ABERCROMBIE”)。

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

LIKE '%#_B%' ESCAPE # 

让你找到它包含一个“_”后面的任何串的“ B”。 (如“TEST_BATMAN”)。

我希望有所帮助。

Al_th

+0

Thanx Al_th ...但我想知道如何在查询函数中使用LIKE子句。 – 2012-07-27 17:06:14

+0

我想你可能会对这个问题的第一个答案感兴趣,如果问题在查询函数中:http://stackoverflow.com/questions/5179563/sqlite-like-problem-in-android。 – 2012-07-27 17:42:54

+0

Thanx很多....你的链接服务的目的.. :) – 2012-07-28 06:14:08

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"); 
+0

你试过吗? – 2012-07-27 14:31:27

+0

我还没有创建任何数据库。我从android的默认收件箱中检索消息。所以在这种情况下db.query不能使用。 – 2012-07-27 17:04:48

+0

Thanx努力为您的努力... :) 问题是与问号...更新的代码如下: String arg =“'%”+ searchtxt.getText()。toString()+“ %'“; Cursor c = getContentResolver()。query(SMS_INBOX,colList,“address LIKE”+ arg,null,“DATE desc”); – 2012-07-28 06:16:38

0

我也有这个问题,在我的代码,我花了一段时间才能找到正确的答案。 对我而言,@Arushi gupta在他的回复中写道:

这里是我的工作代码,经过调整,以便用户可以执行精确的搜索查询或搜索包含查询中的单词的值(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; 
     } 

我验证了这个代码工作有计划,欢迎您尝试。

相关问题