Problema con FMDB e inserción de valor en "executeQuery:" desde un searchString

Al crear una búsqueda para mi aplicación, me encontré con un problema mientras utilizaba el contenedor FMDB SQLite (https://github.com/ccgus/fmdb).

Cuando busco en mi database con este command SQL, todo está bien. Se devuelven 13 objects y puedo usarlos.

FMResultSet *rs = [db executeQuery:@"SELECT * FROM ZARTICLE WHERE ZTITLEDE LIKE '%Daimler%'"]; 

Pero cuando trato de insert searchQuery desde la input de usuario de esta manera:

 FMResultSet *rs = [db executeQuery:@"SELECT * FROM ZARTICLE WHERE ZTITLEDE LIKE (?)", theSearchQuery]; 

… el valor no se inserta en el command SQL. Y no recibo ningún object devuelto del DB. incluso si el String (theSearchQuery) es el mismo escrito en el primer ejemplo.

Además, publico una parte de la documentation de FMDB para su convinience. 🙂

 Data Sanitization 

Al proporcionar una statement de SQL a FMDB, no debe intentar "desinfectar" ningún valor antes de la inserción. En su lugar, debe usar la syntax de enlace SQLite estándar:

INSERTAR EN myTable VALUES (?,?,?) The? SQLite reconoce el caracter como un marcador de position para que se inserte un valor. Todos los methods de ejecución aceptan una cantidad variable de arguments (o una representación de esos arguments, como un NSArray o una va_list), que se escapingon correctamente para usted.

Por lo tanto, NO DEBES hacer esto (o algo así):

[db executeUpdate: [NSString stringWithFormat: @ "INSERT INTO myTable VALUES (% @)", @ "esto tiene \" muchas "extrañas \" comillas '"]]; En cambio, DEBE hacer:

[db executeUpdate: @ "INSERT INTO myTable VALUES (?)", @ "this has \" lots of 'bizarre \ "quotes'"]; Todos los arguments proporcionados al método -executeUpdate: (o cualquiera de las variantes que aceptan una va_list como parámetro) deben ser objects. Lo siguiente no funcionará (y provocará un locking):

[db executeUpdate: @ "INSERT INTO myTable VALUES (?)", 42]; La forma correcta de insert un número es boxearlo en un object NSNumber:

[db executeUpdate: @ "INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt: 42]]; Alternativamente, puede utilizar la opción -execute * WithFormat: variante para usar la sustitución de estilo NSString:

[db executeUpdateWithFormat: @ "INSERT INTO myTable VALUES (% d)", 42]; Internamente, el command -execute * WithFormat: los methods están configurando correctamente las cosas para ti. Se reconocen los siguientes modificadores porcentuales:% @,% c,% s,% d,% D,% i,% u,% U,% hola,% hu,% qi,% qu,% f,% g,% ld,% lu,% lld y% llu. Usar un modificador que no sea los tendrá resultados impnetworkingecibles. Si, por alguna razón, necesita que aparezca el carácter% en su instrucción SQL, debe usar %%.

 NSString *search_text = [NSString stringWithFormat:@"%%%@%%", theSearchQuery]; FMResultSet *rs = [db executeQuery:@"SELECT * FROM ZARTICLE WHERE ZTITLEDE LIKE ?", search_text]; 

Recomiendo encarecidamente evitar crear consultas con stringWithFormat :! Hay una buena razón por la cual FMDB intenta forzarlo a usar su saneamiento de datos. Sin embargo, dado que FMDB está encajonando su input, los paréntesis circundantes en el siguiente código no son necesarios y pueden causar su problema.

 [db executeQuery:@"SELECT * FROM ZARTICLE WHERE ZTITLEDE LIKE (?)", theSearchQuery]; 

Simplemente agregue arguments sin ninguna parenthisis porque nunca sabe cómo FMDB recorta su argumento internamente.

 [db executeQuery:@"SELECT * FROM ZARTICLE WHERE ZTITLEDE LIKE ?", theSearchQuery]; 

Si esto todavía no funciona intente utilizar el método executeQueryWithFormat sugerido: FMDB:

 [db executeQueryWithFormat:@"SELECT * FROM ZARTICLE WHERE ZTITLEDE LIKE %@", theSearchQuery];