2014-09-18 180 views
1

我有一個問題。 我從JSON獲取信息,並且他返回了無效字符。 JSON給我這個:「27 /」「當我需要這個:27」。我知道這是一個特殊字符的編碼,但是當我使用NSString的值在SQLite表中創建一個Insert時,我不能使用27 /「因爲插入格式是這樣的:INSERT INTO FORMATOS(ID,NOMBRE)VALUES (「17」,「27」「)。特殊字符JSON iOS SQLite

我需要什麼方法在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} 

] 
+0

向我們展示JSON。 – 2014-09-18 16:38:57

+0

並向我們展示如何創建INSERT語句。 – 2014-09-18 16:40:34

+0

你發佈的JSON不包含'27「'或類似的東西,但是如果你使用了」準備好的語句「,你將避免很多問題 – 2014-09-18 17:57:31

回答

3

的問題是,你建立你的SQL與stringWithFormat。這是一種容易出現這種問題的做法。請改用SQL中的?佔位符,然後使用sqlite3_bind_text將值綁定到?佔位符。請參閱sqlite3_bind_text() help瞭解更多信息。

例如,您可能:

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)完成陳述後完成。

+0

值得注意的是[FMDB](https://github.com/ccgus/fmdb)簡化了這一點,在一個聲明中完成了所有這些工作,我知道這是一個比你現在想要的更加戲劇性的轉變,但如果幹的話g很多SQLite編程,FMDB讓生活變得更容易。 – Rob 2014-09-18 18:54:27

+0

真棒!!!!它工作完美! – PlugInBoy 2014-09-19 07:27:25