Problema sqlite3 de ObjectiveC

Estoy descubriendo que tengo un problema al actualizar / insert en mi tabla en mi aplicación de iPhone porque tengo una columna TEXT, y cuando ese text incluye un 'símbolo, las cosas se ponen mal. ¿Cuál es la mejor manera de manejar esto?

¿Debo verificar antes de usar una cadena que tenga un apóstrofo? ¿Hay una manera rápida de agregar formatting que agregue un carácter de escape en frente de cada apóstrofo?

¿Tiene esta pregunta incluso sentido? jajaja

sqlite requiere que 'el símbolo se escape por dos' '.

Mira esto en las FAQ oficiales de sqlite :

  (14) ¿Cómo utilizo un literal de cadena que contenga un carácter embedded de comillas simples (')?

 El estándar SQL especifica que las comillas simples en cadenas se escapan al poner dos comillas simples en una fila.  SQL funciona como el lenguaje de progtwigción Pascal en el aspecto.  SQLite sigue este estándar.  Ejemplo:

     INSERTAR A xyz VALUES ('5 O'clock'); 

hey, olvida todas estas cosas Si quieres que tu DB contenga '. Simplemente reemplaza tu cadena por% 27 y al recuperarla vuelve a convertirla. Obtendrás lo que quieras. Verifique a continuación:

// while Inserting into db str = [str stringByReplacingOccurrencesOfString:@"'" withString:@"%27"]; // while fetching it back text = [text stringByReplacingOccurrencesOfString:@"%27" withString:@"'"]; 

Disfruta de la progtwigción 🙂 🙂

Hay tres forms de resolver esto:

  1. Haz el formateo tú mismo. No hagas esto (Bueno, no a less que esta cadena sea parte de su código en lugar de la input del usuario. En ese caso, este enfoque está bien.)
  2. Use sqlite3_mprintf("%Q") para que SQLite haga esto. ( %q hace reemploop de cotización; %Q hace reemploop de cotización e inserta NULL para un puntero nulo).
  3. Use enlaces en su statement que complete con sqlite3_bind_text . Esta es la mejor manera de hacer esto, ya que no requiere volver a comstackr la instrucción para cada cadena y no te abre a SQL Injection .

Usar un enlace se vería así:

 sqlite3_prepare(db, "INSERT INTO Table(Column) VALUES(?);", -1, &stmt, NULL); sqlite3_bind_text(stmt, 1, [str cStringUsingEncoding:NSUTF8StringEncoding], -1, SQLITE_TRANSIENT); // stepping, etc 

(No olvide hacer la comprobación de errores).

Hay una function provista con SQLite que puede escaping a los personajes según sea necesario. Eche un vistazo a: sqlite3_mprintf

http://www.sqlite.org/c3ref/mprintf.html