2012-07-27 18 views
6

Estoy haciendo una aplicación que busca mensajes en la bandeja de entrada según el número del remitente. Aquí está mi código:Cómo utilizar la cláusula LIKE en la función de consulta

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

El código anterior funciona bien pero recupera todos los mensajes en la bandeja de entrada. Quiero que recupere solo aquellos mensajes que coinciden con el número del remitente. Para eso probé una consulta usando la cláusula LIKE, pero con eso devuelve 0 registros. ¿Cuál es la forma correcta de usar la cláusula LIKE? Aquí está el código que he intentado usar COMO

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

por favor me ayude .... Gracias ...

+0

Tal vez debería usar ILIKE, que hace que la consulta sea insensible a – Alptugay

+0

Thanx Alptugay .... pero no funciona .. –

Respuesta

7

Hay dos comodín: "%" y "_".

"%" está reemplazando cualquier cadena (múltiples caracteres),

"_" está sustituyendo a uno (y sólo uno) de caracteres.

Por ejemplo:

LIKE 'B%' 

vamos a encontrar todo lo que empieza con "B". (como "BATMAN");

LIKE '%B%' 

vamos a encontrar Everthing que contiene "B". (como "ABBA");

LIKE'_B%' 

le permiten encontrar todo lo que contiene UN caracter, luego una "B". (como "ABERCROMBIE)".

si desea recuperar una cadena que contiene "%" o "_", es posible utilizar un caracter de escape:

LIKE '%#_B%' ESCAPE # 

vamos a encontrar cualquier cadena que contiene uno "_" seguido de un " SEGUNDO". (como "TEST_BATMAN").

Espero que haya sido de ayuda.

Al_th

+0

Gracias Al_th ... pero quería saber cómo usar la cláusula LIKE en la función de consulta. –

+0

Creo que usted podría estar interesado un poco con la primera respuesta de esa pregunta si el problema está dentro de la función de consulta: http://stackoverflow.com/questions/5179563/sqlite-like-problem-in-android. –

+0

Gracias mucho .... su enlace sirve el propósito .. :) –

2

intente seguir editado:

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

¿Has probado esto ?? –

+0

No he creado ninguna base de datos. Estoy recuperando mensajes de la bandeja de entrada predeterminada de Android. entonces en ese caso db.query no puede ser usado. –

+0

Gracias por sus esfuerzos Chintan ... :) El problema fue con el signo de interrogación ... El código actualizado es el siguiente: Cadena arg = "'%" + searchtxt.getText(). ToString() + " % '"; . Cursor c = getContentResolver() consulta (SMS_INBOX, colList, "dirección como "+ arg, null," FECHA desc"); –

0

también he tenido este problema en mi código, y me tomó un tiempo para encontrar la respuesta correcta. Lo que funcionó para mí es lo que @Arushi gupta escribió en su respuesta.

Aquí está mi código de trabajo, adaptado para que el usuario pueda realizar consultas de búsqueda EXACTAS o buscar valores que contengan las palabras en la consulta (operador AND o operador OR). Mi código utiliza un CursorLoader, pero es lo mismo que usar un ContentResolver para este ejemplo:

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

Y aquí es el método de selección en el contrato 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; 
     } 

me demostró que este código funciona como se planeado, puedes intentarlo.

Cuestiones relacionadas