2011-06-13 19 views
21

tengo la siguiente clase de ayuda DB:Excepción SQLite hay tal columna cuando se trata de seleccionar

public int studentExists(String studid) { 
    Cursor dataCount = mDb.rawQuery("select count(*) from usertable where " + KEY_STUDID + "=" + studid, null); 
    dataCount.moveToFirst(); 
    int count = dataCount.getInt(0); 
    dataCount.close(); 
    return count; 
} 

uso este en mi aplicación para ver si una identificación de estudiante ha sido introducido previamente.

Esto funciona bien cuando las identificaciones de los estudiantes son entradas (346742) pero cada vez que intento agregar una identificación alfanumérica (PB3874) se cierra la aplicación.

error:

06-13 18:22:20.554: ERROR/AndroidRuntime(8088): android.database.sqlite.SQLiteException: no such column: pb3874: , while compiling: select count(*) from usertable where studid=pb3874

no creo que es un problema de tipo de datos (porque uso el tipo de texto):

private static final String DATABASE_CREATE = 
    "create table usertable (_id integer primary key autoincrement, " 
    + "studid text not null);"; 

Pero estoy confundido por qué el error está diciendo no such column: pb3874 como estoy tratando de simplemente seleccionar ese valor de la columna studid. Y también por qué esto funciona perfectamente para cualquier valor int. ¿Alguien tiene algún consejo para resolver problemas?

+0

duplicado posible de [insertar tema SQLite - Error: no hay tal columna] (https://stackoverflow.com/questions/21958789/sqlite-insert-issue-error-no-such-column) – Veve

Respuesta

53

Lo que está sucediendo aquí es que SQLite piensa que 'pb3874' es realmente un nombre de columna, en lugar de un literal de cadena/texto.

para especificar que se trata de un texto literal, usted querrá asegurarse de que su valor de texto se envuelve en las comillas simples apropiadas:

para prevenir ataques de inyección SQL, cada vez que usted está tomando la entrada del usuario, el uso una consulta parametrizada:

("select count(*) from usertable where " + KEY_STUDID + "=?", studid); 

Sin parametrización (muy desalentado cuando se toma la entrada del usuario):

("select count(*) from usertable where " + KEY_STUDID + "='" + studid + "'", null); 

La razón de su val numérica Esto no produjo esto: SQLite convirtió esos literales numéricos para usted.

+1

Gracias, su respuesta me ayudó a solucionar un problema. Se olvidó de incluir comillas simples para cadena y obtuvo la misma SQLiteException. – webgenius

+0

@webgenius, esa fue una respuesta realmente útil. Gracias –

+0

@ p.campbell Muchas gracias – PN10

5

Debe citar 'pb3874' (comillas simples) si lo está incluyendo en la cadena de SQL.

2

Creo que tienes la respuesta a lo que está mal de Antlersoft o p.campbell, para dar formato a la consulta correctamente, sugeriría, lo haces de esta manera:

mDb.rawQuery("select count(*) from usertable where " + KEY_STUDID + "=?", studid); 

Eso debería (1) resolver su problema y (2) a protegerse de las inyecciones SQL

Además, no estoy seguro de que

dataCount.getInt(0); 

es el mejor que puede hacer ... probablemente debería utilizar a getColumnIndex Asegúrese de que está recibiendo los datos correctos ...

+0

+1 de acuerdo.Gracias Matt. Añadiré descaradamente la parametrización a mi respuesta con la esperanza de que los futuros visitantes de SQLite de Android a esta página obtengan el beneficio de la prevención de inyección SQL. ¡Gracias! –

0

de STRING que se debe colocar en el medio '' ('') sasas

select * from bio where email = 'sasas' 
Cuestiones relacionadas