2012-07-27 17 views
6

Tworzę aplikację, która przeszukuje wiadomości w skrzynce odbiorczej na podstawie numeru nadawcy. Tu jest mój kodu:Jak korzystać z klauzuli LIKE w funkcji zapytania

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

Powyższy kod działa poprawnie, ale pobiera wszystkie wiadomości w skrzynce odbiorczej. Chcę, aby pobierał tylko te wiadomości, które pasują do numeru nadawcy. Do tego próbowałem kwerendy za pomocą klauzuli LIKE, ale z tym zwraca 0 rekordów. Jaki jest poprawny sposób korzystania z klauzuli LIKE. Oto kod, który Próbowałem za pomocą 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(); 

Proszę mi pomóc .... Dziękuję ...

+0

Może powinieneś użyć ILIKE, co powoduje, że zapytanie jest niewrażliwe na zapytanie – Alptugay

+0

Thanx Alptugay ... ale to działa .. –

Odpowiedz

7

Jest dwa Joker: "%" i "_".

"%" zastępuje dowolny ciąg znaków (wielokrotne),

"_" jest zastąpienie jednego (i tylko jeden) charakter.

Na przykład:

LIKE 'B%' 

pozwalają odnaleźć wszystko, co zaczyna się od "B". (jak "BATMAN");

LIKE '%B%' 

pozwala znaleźć wszystko, co zawiera "B". (jak "ABBA");

LIKE'_B%' 

pozwala znaleźć wszystko, co zawiera JEDEN caracter, a następnie "B". (np. "ABERCROMBIE)".

jeśli chcesz odzyskać ciąg, który zawiera „%” lub „_”, można użyć caracter ucieczki:

LIKE '%#_B%' ESCAPE # 

pozwalają znaleźć żadnych strun, która zawiera jeden „_”, a następnie przez " B". (jak "TEST_BATMAN").

Mam nadzieję, że pomogło.

Al_th

+0

Thanx Al_th ... ale chciałem wiedzieć, jak używać klauzuli LIKE w funkcji zapytania. –

+0

Myślę, że możesz być zainteresowany pierwszą odpowiedzią tego pytania, jeśli problem leży w funkcji zapytania: http://stackoverflow.com/questions/5179563/sqlite-like-problem-in-android. –

+0

Bardzo dużo .... Twój link służył celowi .. :) –

2

Spróbuj następujących 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

Czy próbowałeś tego? –

+0

Nie utworzyłem żadnej bazy danych. Odbieram wiadomości z domyślnej skrzynki odbiorczej Androida. więc w takim przypadku nie można użyć db.query. –

+0

Dzięki za twoje wysiłki Chintan ... :) Problem polegał na pytaniu ... Zaktualizowany kod wygląda następująco: String arg = "'%" + searchtxt.getText(). ToString() + " % ""; Cursor c = getContentResolver(). Query (SMS_INBOX, colList, "address LIKE" + arg, null, "DATE ​​desc"); –

0

miałem również ten problem w moim kodu, i zajęło mi trochę czasu, aby znaleźć właściwą odpowiedź. Co zadziałało dla mnie, to co @Aushi gupta napisał w swojej odpowiedzi.

Oto mój działający kod, dostosowany tak, aby użytkownik mógł wykonywać DOKŁADNE zapytania lub wyszukiwać wartości zawierające słowa w zapytaniu (operator AND lub operator OR). Mój kod wykorzystuje CursorLoader, ale to jest taka sama jak przy użyciu ContentResolver dla tego przykładu:

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

A oto metoda wyboru w umowie 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; 
     } 

I sprawdzeniu, że ten kod działa jak planowane, możesz go wypróbować.

Powiązane problemy