2011-07-03 17 views
6

Tengo el siguiente código que crea mi tabla. Insertar datos en él que se parece a este códigoProblema con SQL Query Android Donde Cláusula

_id  date  recordName  total 
-------------------------------------- 
7  2011  TestMaxRecord  5 

Java:

public static final String KEY_ROWID = "_id"; 
public static final String KEY_DATE = "date"; 
public static final String KEY_TOTAL = "total"; 
public static final String KEY_RECORD_NAME = "recordName"; 

private static final String DATABASE_CREATE_RECORDS = "create table " + DATABASE_TABLE_RECORDS + " (" 
+ KEY_ROWID + " integer primary key autoincrement, " 
+ KEY_DATE + " text not null, " 
+ KEY_RECORD_NAME + " text not null, " 
+ KEY_TOTAL + " text not null);"; 

public Cursor getRecord(String name) throws SQLException { 
    return mDb.query(true, DATABASE_TABLE_RECORDS, new String[] {KEY_ROWID, KEY_DATE, KEY_RECORD_NAME, KEY_TOTAL}, KEY_RECORD_NAME + " = " + name, null, null, null, null, null); 
} 

lanza una excepción cada vez que donde name = "TestMaxRecord" (a pesar de ser los datos allí) con el siguiente error

android.database.sqlite.SQLiteException: hay tal columna: TestMaxRecord:, durante la compilación: SELECT DISTINCT _id, fecha, RecordName, total a partir de los registros donde RecordName = TestMaxRecord

Que me parece que está buscando un título de columna TestMaxRecord. Soy un novato de Android, pero copié esta porción casi exactamente de un ejemplo (aunque estaba usando int). ¿Hay alguna diferencia entre usar int y Strings en tu consulta?

Respuesta

11

Debe poner comillas simples alrededor del valor, de lo contrario lo tratará como una columna.

KEY_RECORD_NAME + " = '" + name + "'" 

Nota: Esta solución está abierto a inyección SQL, debe utilizar marcadores de posición, y pasar los valores a través del selectionArgs argumento:

public Cursor getRecord(String name) throws SQLException { 
    return mDb.query(true, 
    DATABASE_TABLE_RECORDS, 
    new String[] {KEY_ROWID, KEY_DATE, KEY_RECORD_NAME, KEY_TOTAL}, 
    KEY_RECORD_NAME + " = ?", 
    new String[] {name}, 
    null, null, null, null); 
} 

Alternativamente, mira en SQLiteQueryBuilder

+0

Sí que funcionó , Gracias. ¿Eso es porque es una cadena? He revisado los recursos en su enlace antes y no ayuda con las cláusulas WHERE. Mucho menos cadenas en las cláusulas WHERE ... al menos que alguna vez he encontrado. – easycheese