2011-06-06 16 views
8

No puedo obtener la cláusula WHERE IN para trabajar en la base de datos SQLite de Android.WHERE cláusula en Android sqlite?

¿Hay alguna forma de ejecutar una declaración como esta en android? :

SELECT body FROM table1 WHERE title IN ('title1', 'title2', 'title3') 
+3

¿Qué excepción reciben? ¿Cómo es tu código? – Maximus

Respuesta

8

Usted tendrá que utilizar el rawQuery método:

Cursor c = db.rawQuery("SELECT body FROM table1 WHERE title IN ('title1', 'title2', 'title3')"); 
+0

Gracias! Funcionó. Lo estaba intentando de esta manera antes, pero aparentemente tenía algunos problemas de sintaxis ... – fediva

+0

"tratando de hacerlo de esta manera" – fediva

2

Si está utilizando un proveedor de contenidos puede utilizar la función de consulta como tal:

getContentResolver().query(URI,new String[] {"body"}, "title IN ?", new String[] {"('title1','title2','title3')"}, null) 

en cuenta que yo no lo he probado, pero de acuerdo con la documentación, esto debería funcionar.

+0

esto no funciona en Android 4.0.4 - Las clases de contenedor SQLite arrojan excepciones – Anatoliy

+1

Esto no lo hará trabajo. Se traducirá a 'SELECT body FROM table1 WHERE title IN' ('title1', 'title2', 'title3') ''. Observe '' 's alrededor de toda la parte del argumento. – Antimonit

1

Otra forma de hacer esto

Cursor mCursor = SQLiteDatabase.query(true, "Name of table","String array of selection columns","title in ('title1', 'title2', 'title3')", null, null, null, null, null); 
if (mCursor != null) { 
    mCursor.moveToFirst(); 
} 
1

Por favor, eche un vistazo a este answer. Me ayudó en el caso similar.

String[] names = { "name1", "name2" }; // do whatever is needed first 
String query = "SELECT * FROM table" + " WHERE name IN (" + makePlaceholders(names.length) + ")"; 
Cursor cursor = mDb.rawQuery(query, names); 

El punto principal aquí es proporcionar marcadores de posición de signo de variable (?) Para que coincida con sus elementos de la cláusula IN. Y, por supuesto, argumento para ellos como String array.

+0

¿sabes cómo hacer esto con una matriz de INT []? Mi columna sobre la que aplica IN es de tipo INTEGER. – Brabbeldas

+0

tienes que convertir tu matriz arbitraria a String [] – Anatoliy

8

Puede utilizar TextUtils.join(",", parameters) para tomar ventaja de parámetros de unión SQLite, donde parameters es una lista con "?" marcadores de posición y la cadena resultado es algo así como "?,?,..,?".

Aquí hay un pequeño ejemplo:

Set<Integer> positionsSet = membersListCursorAdapter.getCurrentCheckedPosition(); 
List<String> ids = new ArrayList<>(); 
List<String> parameters = new ArrayList<>(); 
for (Integer position : positionsSet) { 
    ids.add(String.valueOf(membersListCursorAdapter.getItemId(position))); 
    parameters.add("?"); 
} 
getActivity().getContentResolver().delete(
    SharedUserTable.CONTENT_URI, 
    SharedUserTable._ID + " in (" + TextUtils.join(",", parameters) + ")", 
    ids.toArray(new String[ids.size()]) 
); 
+0

Gracias. Esto me ayudó mucho. No sabía que tenía que proporcionar un marcador de posición separado ('?') Para cada parámetro en la cláusula "IN". Pensé que bastaba un solo marcador de posición con un único parámetro de cadena (múltiples valores unidos en él). – stan0

+0

¿es así como lo hiciste? String donde = ContactsContract.RawContacts.CONTACT_ID + "IN (??)"; –

0

Agregando a Cristian respuesta: Mientras que su respuesta va a trabajar, usted debe tratar de usar la forma correcta de la consulta:

db.rawQuery("Select * from table1 where title = ?", new String[]{param1});

Este El enfoque también se puede usar con la cláusula WHERE IN, pero la cadena pasada debe estar en formato de 'asd', 'zxc', 'qwe'

Me gusta esto:

String param1 = "\'asd\',\'zxc\',\'qwe\'"; 
db.rawQuery("Select * from table1 where title in (?)", new String[]{param1});