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:
- No puedo crear una base de datos SQLite en mi aplicación android
- Desempeño de Android: Archivo plano vs SQLite
- Preguntas sobre el uso de Android Backup Service con una base de datos SQLite
- Obtención de base de datos SQLite y almacenamiento en una matriz de objetos
- No se puede capturar Java (Android) Excepción con try-catch
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?
- SQLite Database: SQLiteDiskIOException: error de E / S de disco (código 1802)
- ¿Cómo consultar la base de datos SQLite con dos condiciones?
- Android: Cómo sumar todas las columnas de una base de datos SQLite y devolver 1 variable única
- ¿Por qué onUpgrade () no está siendo invocado en la base de datos Android sqlite?
- Utilizar la instrucción LIMIT en una consulta SQLite
- Implementación correcta de la base de datos Android asíncrona de SQLite
- Acerca de la seguridad de Sqlite en android en caso de varios procesos
- Prueba de la unidad de Android Studio SQLiteDataBase es nula
¿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], };