我有一个问题。我从JSON获取信息,他返回了无效字符。JSON给我这个:“ 27 /”“,当我需要这个时:27”。我知道这是特殊字符的编码,但是当我使用NSString上的值在SQLite表中进行插入时,我不能使用27 /“,因为插入格式为:INSERT INTO FORMATOS(ID,NOMBRE)VALUES (“ 17”,“ 27””)。
我需要哪种方法在SQLlite中正确插入信息?
for (int i = 0; i<idFormato.count; i++) { NSString *idStr = [idFormato objectAtIndex:i]; NSString *nameStr = [nameFormato objectAtIndex:i]; insertSQL = [NSString stringWithFormat:@"INSERT INTO FORMATOS (ID, NOMBRE) VALUES (\"%@\", \"%@\")", idStr, nameStr]; //Char constant with the query encoded un UTF const char *insert_stmt = [insertSQL UTF8String]; //Execute query sqlite3_prepare_v2(dieneDB, insert_stmt, -1, &statement, NULL); //Check if Statment is dne correctly if(sqlite3_step(statement) == SQLITE_DONE){ NSLog(@"Guardado Formatos correctamente"); }
JSON:
[ {"ID_FORMATO_INT":"17","NOMBRE_FORMATO_STR":"2,5\"","ID_USUARIO_ALTA_INT":"3","FECHA_ALTA_FORMATO_DAT":"2014-09-18 07:17:55","ID_USUARIO_MOD_INT":null,"FECHA_MOD_FORMATO_DAT":null},{"ID_FORMATO_INT":"18","NOMBRE_FORMATO_STR":"4\"","ID_USUARIO_ALTA_INT":"3","FECHA_ALTA_FORMATO_DAT":"2014-09-18 07:18:20","ID_USUARIO_MOD_INT":null,"FECHA_MOD_FORMATO_DAT":null},{"ID_FORMATO_INT":"19","NOMBRE_FORMATO_STR":"4,7\"","ID_USUARIO_ALTA_INT":"3","FECHA_ALTA_FORMATO_DAT":"2014-09-18 07:20:07","ID_USUARIO_MOD_INT":null,"FECHA_MOD_FORMATO_DAT":null},{"ID_FORMATO_INT":"20","NOMBRE_FORMATO_STR":"5,5\"","ID_USUARIO_ALTA_INT":"3","FECHA_ALTA_FORMATO_DAT":"2014-09-18 07:20:15","ID_USUARIO_MOD_INT":null,"FECHA_MOD_FORMATO_DAT":null},{"ID_FORMATO_INT":"21","NOMBRE_FORMATO_STR":"9,7\"","ID_USUARIO_ALTA_INT":"3","FECHA_ALTA_FORMATO_DAT":"2014-09-18 07:20:42","ID_USUARIO_MOD_INT":null,"FECHA_MOD_FORMATO_DAT":null},{"ID_FORMATO_INT":"22","NOMBRE_FORMATO_STR":"7,9\"","ID_USUARIO_ALTA_INT":"3","FECHA_ALTA_FORMATO_DAT":"2014-09-18 07:21:04","ID_USUARIO_MOD_INT":null,"FECHA_MOD_FORMATO_DAT":null},{"ID_FORMATO_INT":"23","NOMBRE_FORMATO_STR":"11\"","ID_USUARIO_ALTA_INT":"3","FECHA_ALTA_FORMATO_DAT":"2014-09-18 07:22:40","ID_USUARIO_MOD_INT":null,"FECHA_MOD_FORMATO_DAT":null},{"ID_FORMATO_INT":"24","NOMBRE_FORMATO_STR":"13\"","ID_USUARIO_ALTA_INT":"3","FECHA_ALTA_FORMATO_DAT":"2014-09-18 07:22:44","ID_USUARIO_MOD_INT":null,"FECHA_MOD_FORMATO_DAT":null},{"ID_FORMATO_INT":"25","NOMBRE_FORMATO_STR":"15\"","ID_USUARIO_ALTA_INT":"3","FECHA_ALTA_FORMATO_DAT":"2014-09-18 07:22:49","ID_USUARIO_MOD_INT":null,"FECHA_MOD_FORMATO_DAT":null},{"ID_FORMATO_INT":"26","NOMBRE_FORMATO_STR":"21,5\"","ID_USUARIO_ALTA_INT":"3","FECHA_ALTA_FORMATO_DAT":"2014-09-18 07:23:11","ID_USUARIO_MOD_INT":null,"FECHA_MOD_FORMATO_DAT":null},{"ID_FORMATO_INT":"27","NOMBRE_FORMATO_STR":"27\"","ID_USUARIO_ALTA_INT":"3","FECHA_ALTA_FORMATO_DAT":"2014-09-18 07:23:14","ID_USUARIO_MOD_INT":null,"FECHA_MOD_FORMATO_DAT":null} ]
问题是您正在使用构建SQL stringWithFormat。这是一种容易出现此类问题的做法。而是?在SQL中使用占位符,然后用于sqlite3_bind_text将值绑定到?占位符。请参阅sqlite3_bind_text()帮助以获取更多信息。
stringWithFormat
?
sqlite3_bind_text
sqlite3_bind_text()
例如,您可能会:
const char *insert_stmt = "INSERT INTO FORMATOS (ID, NOMBRE) VALUES (?, ?)"; if (sqlite3_prepare_v2(dieneDB, insert_stmt, -1, &statement, NULL) != SQLITE_OK) { // prepare SQL NSLog(@"prepare error: %s", sqlite3_errmsg(dieneDB)); } else { if (sqlite3_bind_text(statement, 1, idStr, -1, NULL) != SQLITE_OK) { // bind 1 NSLog(@"bind idStr error: %s", sqlite3_errmsg(dieneDB)); } else if (sqlite3_bind_text(statement, 2, nameStr, -1, NULL) != SQLITE_OK) { // bind 2 NSLog(@"bind nameStr error: %s", sqlite3_errmsg(dieneDB)); } else if (sqlite3_step(statement) != SQLITE_DONE) { // perform SQL NSLog(@"step error: %s", sqlite3_errmsg(dieneDB)); } else { NSLog(@"Guardado Formatos correctamente"); } sqlite3_finalize(statement); }
我只是输入了此内容,因此请原谅任何错别字,但希望它能说明您的想法。
注意,我也(a)检查所有这些返回码;(b)记录错误(如果有);(c)完成后完成陈述。