2011-04-22 13 views
12

estoy trabajando en una base de datos con SQLLite en una aplicación para Android Quiero recuperar datos sm utilizando una cláusula como ejemplo:uso no puede como cláusula en la aplicación para Android

Cursor c = myDB.query(MY_DATABASE_TABLE, null, " SongName LIKE '%"+"=?"+"%'" , 
      new String[]{match_str}, null, null,"SongHit DESC"); 

Se debe dar todo songName comenzando con match_str pero no funciona. ¿Por qué?

Respuesta

25

Este:

" SongName LIKE '%"+"=?"+"%'" 

terminará pareciéndose a esto cuando el intérprete de SQL ve:

" SongName LIKE '%=?%'" 

Y que coincidirá con cualquier nombre de canción que contenga un lite ral "=?" y no creo que sea algo como lo que quieres.

A % coincide con cualquier secuencia de caracteres en un SQL LIKE, es esencialmente lo mismo que .* en una expresión regular; por lo tanto, si desea unir al principio, entonces no desea un % líder. Además, su marcador de posición ? debe estar fuera de las comillas simples o se interpretará como un signo de interrogación literal en lugar de un marcador de posición.

quieres algo más a esto:

String[] a = new String[1]; 
a[0]  = match_str + '%'; 
Cursor c = myDB.rawQuery("SELECT * FROM songs WHERE SongName LIKE ?", a); 

Si quería ser muy estricta que también tendría que escapar % y _ símbolos dentro match_str también, pero lo que queda como ejercicio para el lector.

+0

estoy dvlping una aplicación andr con un EditarTexto que permite a los usuarios buscar songs.i quieren use srch instantáneo en él, quiero decir que quiero los resultados de búsqueda en mi lista de mi aplicación al instante, ya que el usuario escribe en el cuadro de texto de edición en orden de las canciones más visitadas. Estoy utilizando una base de datos de canciones para ella, pero me temo que puede ser demasiado slow.Besides quiero mi EditarTexto listner a disminuir la velocidad y espera hasta que el usuario termina su texto estoy usando System.currentTimeMillis() como marcador ND esperar fr. 5 segundos, no está esperando. soy nuevo en Android y no sé tiempo lo que va a funcionar o no .. pls me sugieren smthing – sayantan

+0

@ user712771: Eso suena como una pregunta totalmente nueva que sería mejor contestada por alguien que conoce Android mejor que yo. –

+0

gracias, pero realmente pensé u podría help..i creo que debería pedir como una cuestión separada .. – sayantan

1

No hay necesidad del signo igual y debe poder incluir el? justo en la cuerda sin la necesidad del operador +. La cláusula donde solo debería ser:

"SongName LIKE '%?%'" 

y si mu es demasiado corto es correcta y que sólo quiere que empiezan por ...

"SongName LIKE '?%'" 
+0

creo que es necesario dejar caer las comillas simples '?' Para que sea un marcador de posición en lugar de una cadena literal. –

+0

parece funcionar bien mi aplicación sigue fallando – sayantan

+0

gracias mu, tienes razón. Realmente no he usado el? y la selección args en mis propias consultas, así que no estaba 100% claro en su uso ... – Maximus

0

hi ¿Está recibiendo ninguna excepción durante la ejecución de la consulta anterior. Pruebe quitando el símbolo "=" delante del signo de interrogación en la condición similar. Otra cosa trate de usar

db.rawQuery(sql, selectionArgs) 
9

Prueba esto:

String[] args = new String[1]; 
args[0] = "%"+song+"%"; 
Cursor friendLike = db.rawQuery("SELECT * FROM songs WHERE SongName like ?", args); 
+1

Creo que quieres 'args [0] = song +"% ";' como dicen "starting with ...". –

+0

eso es verdad, solo use un% después del argumento para obtener el ** comienza con ** –

+0

genial funcionó bien ... sin embargo, no entendí por qué la solución anterior no funcionó. – sayantan

0

Esto funciona perfectamente para mí ...

"Songname LIKE ? "... 

cursor = database.rawQuery(query, new String[]{"%" + searchTerm + "%"}); 
0

Si desea utilizar query() en lugar de rawQuery(), puede hacerlo de esta manera:

// searchString is the string to search for 
final String whereClause = "MyColumnName" + " like ?"; 
String[] whereArgs = new String[]{"%" + searchString + "%"}; 

Cursor cursor = sqLiteDatabase.query("MyTableName", 
     null, // columns 
     whereClause, // selection 
     whereArgs, // selectionArgs 
     null, // groupBy 
     null, // having 
     null, // orderBy 
     null); // limit 
0

una forma sencilla es utilizar el concatena el operador ||

"SongName LIKE '%'||?||'%'" 

por lo que no es necesario editar el match_str.

Cursor c = myDB.query(MY_DATABASE_TABLE, null, " SongName LIKE '%'||?||'%'" , 
     new String[]{match_str}, null, null,"SongHit DESC"); 

de https://stackoverflow.com/a/46420813/908821

Cuestiones relacionadas