Estoy intentando hacer la siguiente consulta SQL dentro de Android:EN cláusula y marcadores de posición
String names = "'name1', 'name2"; // in the code this is dynamically generated
String query = "SELECT * FROM table WHERE name IN (?)";
Cursor cursor = mDb.rawQuery(query, new String[]{names});
Sin embargo, Android no reemplaza el signo de interrogación con los valores correctos. Podría hacer lo siguiente, sin embargo, esto no protege contra la inyección de SQL:
String query = "SELECT * FROM table WHERE name IN (" + names + ")";
Cursor cursor = mDb.rawQuery(query, null);
¿Cómo puedo solucionar este problema y ser capaz de utilizar la cláusula IN?
Sí, esta es la (única) forma de utilizar consultas parametrizadas IN() en SQLite y casi cualquier otra base de datos SQL. –
Al usar este método, aumenté el ContentProvider que utilicé y en el método query() se agregó la lógica para probar la presencia: "IN?" y si se encuentra, ¿se cuenta la ocurrencia de "?" en la selección original, en comparación con la duración de los argumentos aprobados, ensambla un "?,?, ...?" por la diferencia y reemplaza el original "IN"? con la colección generada del signo de interrogación. Esto hace que la lógica esté disponible casi global y, para mi uso, parece estar funcionando bien. Tuve que agregar un aprovisionamiento especial para filtrar listas IN vacías, en esos casos, el "IN". es reemplazado por "1" por ahora. – SandWyrm
Lo tonto de esto es, por supuesto, que si vas a hacer tus propios signos de interrogación String with N, también podrías codificar los datos directamente. Suponiendo que está desinfectado. – Christopher