SelectionArgs in ContentResolver.query (…) puede ser una subconsulta?

Estoy trabajando con SQLite en Android.
Utilicé ContentProvider para consultar datos de db. Y ahora, tengo un problema cuando intento usar subconsulta a través de ContentResolver

 String selection = "cat_id NOT IN ?" String[] selectionArgs = new String[]{"(SELECT Categories.id FROM Categories)"} cursor = mResolver.query(getContentUri(), getListColumns(), selection, selectionArgs, orderBy); 

Y este es el error:

 08-06 10:32:36.070: E/AndroidRuntime(2151): Caused by: android.database.sqlite.SQLiteException: near "?": syntax error (code 1): , while compiling: SELECT * FROM TRANSACTIONS WHERE cat_id NOT IN ? ORDER BY time_created ASC, id ASC` 

Mi pregunta es "¿Puedo usar selectionArgs ser una subconsulta?"
Mi propósito es "obtener la lista de transacciones donde cat_id no está en una tabla de categorías".
¿Quién puede ayudarme?

¿No te olvides de eso? Es en realidad un marcador de posición para un valor. Que será vinculado más tarde por Android.

Como tal, usted no pondría una pregunta para ser reemplazado por?. Como el punto de usar el? Es asegurar que el código sql no es inyectado por los parámetros del usuario.

 String selection = "cat_id NOT IN ?" String[] selectionArgs = new String[]{"(SELECT Categories.id FROM Categories)"} cursor = mResolver.query(getContentUri(), getListColumns(), selection, selectionArgs, orderBy); 

Es un equilibrio para ti escribiendo algo como

 String selection = "cat_id NOT IN '(SELECT Categories.id FROM Categories)'" 

Donde la consulta que desea ejecutar es realmente siendo de un valor, lo que significa que NOT IN '(some value)' no es válido sql.

Sugiero que acaba de eliminar el? Y reemplácelo por la consulta que tiene en su donde argumentos que lo arreglarán.

¿Usted utilizaría el? Marcadores de posición como este (si supieras en qué no tenía que estar).

 String selection = "cat_id NOT IN (?, ?)" String[] selectionArgs = new String[]{"value1", "value2"} cursor = mResolver.query(getContentUri(), getListColumns(), selection, selectionArgs, orderBy); 

Editar: probar

 String selection = "cat_id NOT IN (SELECT Categories.id FROM Categories)" cursor = mResolver.query(getContentUri(), getListColumns(), selection, null, orderBy); 

Te doy un ejemplo que debería funcionar (en el método de actualización de ContentResolver en mi caso):

 String selection = DatabaseContract.EventTable.Column.ID_EVENT + " IN (SELECT DISTINCT " + DatabaseContract.CountryEventTable.Column.EVENT_ID + " FROM " + DatabaseContract.CountryEventTable.TABLE_NAME + " WHERE " + DatabaseContract.CountryEventTable.Column.COUNTRY_CODE + "=?)"; String [] selectionArgs = new String[]{ data[0], }; 
  • en un Listview en el artículo de la lista chasquido ¿cómo puedo conseguir el título (el nombre) del artículo seleccionado? androide
  • Cómo insertar valor en la base de datos utilizando sqlite en android?
  • Android: No se puede realizar esta operación porque se ha cerrado el grupo de conexiones
  • Cómo utilizar la conexión SQLite desde la carpeta de activos
  • ¿Cómo elimino una entrada de fila de tabla sqlite por cadena?
  • Actualizar la tabla sqlite en android
  • SQLite selecciona todos los registros de hoy y día anterior
  • Cómo debo abrir y cerrar mi base de datos correctamente
  • Ejecución de varias sentencias con SQLiteDatabase.execSQL
  • Eliminar la base de datos sqlite al actualizar la nueva versión de la aplicación
  • Android sqlite bloqueo con el sistema de archivos exFAT
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.