ios - 特殊字符 JSON iOS SQLite

标签 ios json sqlite

我有一个问题。 我从 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}

]

最佳答案

问题是您正在使用stringWithFormat构建SQL。这种做法很容易出现此类问题。相反,请在 SQL 中使用 ? 占位符,然后使用 sqlite3_bind_text 将值绑定(bind)到 ? 占位符。请参阅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) 完成后确定声明。

关于ios - 特殊字符 JSON iOS SQLite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25918030/

相关文章:

json - ifelse try组合仅返回长度为1的对象

ios - UIView animateWithDuration 和用户交互

ios - 在 Swift 中使用 PFQueryTableViewController 检查互联网连接

ios - 核心数据 : difference between backgroundContext and child context with privateQueueConcurrencyType?

ios - 等到 scrollToRowAtIndexPath swift 完成

javascript - 制作嵌套 JSON Javascript

c++ - 如何在单行代码中使用大括号语法使用 QJsonObjects 创建 QJsonArray?

go - 你能在 Golang 中使用 SQLite ATTACH 和 DETACH 吗?

android - 将数据插入表中,如果已经存在,则将其带到顶部 SQLite

php - Laravel 时间戳计算