2012-07-27 15 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句を使用する正しい方法は何か。 「%」と「_」:ここで私は私を助けてください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

+0

Thanx Alptugay ....しかし、それはうまくいきます。 –

答えて

7

2枚のジョーカーがあります。

"%" は "_"、

を任意の文字列(複数の文字)を交換された1つだけの文字を置き換えています。例えば

LIKE 'B%' 

は、あなたが "B" で始まるすべてを見つけるてみましょう。 (「バットマン」のように)。

LIKE '%B%' 

"B"が含まれているものを見つけることができます。 (「ABBA」など)。

LIKE'_B%' 

「ONE caracter」、次に「B」を含むものすべてを見つけることができます。 (「ABERCROMBIE」のように)。

あなたは「%」または「_」を含む文字列を取得する場合、あなたはエスケープcaracterを使用することがあります。

LIKE '%#_B%' ESCAPE # 

使用すると、1つは、「_」」に続く含む任意の文字列を検索しましょうB "である。 (「TEST_BATMAN」など)。

私はそれが助けてくれることを願っています。

Al_th

+0

Thanx Al_th ...しかし、私はLIKE句をクエリ関数でどのように使うか知りたかったのです。 –

+0

問題がクエリ関数内にある場合、その質問の最初の回答に興味があると思います。http://stackoverflow.com/questions/5179563/sqlite-like-problem-in-android –

+0

Thanxたくさん....あなたのリンクは目的を果たした.. :) –

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

これを試しましたか? –

+0

私はhavent任意のデータベースを作成しました。私はアンドロイドのデフォルトの受信トレイからメッセージを取得しています。その場合、db.queryは使用できません。 –

+0

あなたの努力のための高山... :) 問題は疑問符でした...更新されたコードは次のようになります: 文字列arg = "'%" + searchtxt.getText()。toString()+ " % '"; カーソルc = getContentResolver()。クエリ(SMS_INBOX、colList、 "アドレスLIKE" + arg、null、 "DATE desc"); –

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; 
     } 

私はこのコードのように動作することを確認し計画されている、あなたはそれを試してみて歓迎です。

関連する問題