Como dice el documento Android, los parámetros selectionArgs del método rawQuery se analizan como cadenas.SQLite rawQuery selectionArgs and Integers Fields
SQLiteDatabase.rawQuery (String sql, String [] selectionArgs)
selectionArgs: Usted puede incluir s en la cláusula WHERE en la consulta, que será sustituido por los valores de selectionArgs?. Los valores se vincularán como cadenas.
Pero hoy tuve un problema que me llevó gran parte de mi día. Imagine la siguiente consulta:
SELECT * FROM TABLE_A WHERE IFNULL(COLUMN_A, 0) >= 15
COLUMN_A es INTEGER. La tabla tiene aproximadamente 10 filas que atiende a ese criterio. Al ejecutar la consulta en un editor de base de datos, el resultado siempre fue correcto, pero, en el teléfono inteligente, la instrucción siempre devuelve ninguna fila.
Después de algún tiempo, un cambió la consulta a:
SELECT * FROM TABLE_A WHERE IFNULL(COLUMN_A, 0) >= '15'
y el editor devuelve ninguna fila, al igual que Android. Por lo tanto, cambiar la consulta a:
SELECT * FROM TABLE_A WHERE CAST(IFNULL(COLUMN_A, 0) as INTEGER) >= '15'
ha solucionado el problema. Otra prueba que se realizó fue:
SELECT * FROM TABLE_A WHERE COLUMN_A >= '15'
también, devolvió el resultado correcto.
Esto parece ser un problema que involucra la forma en que Android vincula los parámetros a la consulta (como cadenas) con la cláusula IFNULL.
Entonces, ¿alguien sabe por qué sucedió esto? ¿Hay alguna sugerencia para resolver esto sin usar CAST en la consulta?
Tuve el problema similar y pasé una hora tratando de encontrar un error en mi aplicación. Entonces he encontrado tu publicación. Por lo tanto, es genial que lo hayas escrito aquí. Otra cosa es que nunca entenderé la filosofía de Android y por qué este CAST es obligatorio aquí ... – user2707175