【问题标题】:SQLite- how to insert data in iosSQLite-如何在 ios 中插入数据
【发布时间】:2013-01-05 11:21:47
【问题描述】:

当我用这段代码插入记录时,我尝试了一些 sqlite 程序进行练习,它给出了一些错误

-(void) insertRecordIntoTableNamed:(NSString *) tableName
                            withField1:(NSString *) field1
                           field1Value:(NSString *) field1Value
                             andField2:(NSString *) field2
                           field2Value:(NSString *) field2Value {
        NSString *sql = [NSString stringWithFormat:
                         @"INSERT INTO ‘%@‘ (‘%@‘, ‘%@‘) VALUES (‘%@‘,’%@‘)",tableName, field1, field2, field1Value, field2Value];
        char *err;
        if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK) {
            sqlite3_close(db);
            NSAssert(0, @"Error updating table.");
        }
    }

错误信息是

** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Error updating table.'

我尝试通过终端插入数据并正确检索数据

所以请帮我通过程序插入数据

【问题讨论】:

标签: iphone xcode sqlite


【解决方案1】:

当您使用 char * as sql 语句作为 NSString 对象时,它可能会更好地工作。例如:

char *sql = "INSERT INTO '?' ('?', '?') VALUES ('?' ....";

替换 ?与您的 NSString 参数一起使用下面的函数。

sqlite3_bind_text(insert_statement, 1, [tableName UTF8String], -1, SQLITE_TRANSIENT); sqlite3_bind_text(insert_statement, 2, [field1 UTF8String], -1, SQLITE_TRANSIENT); 等等……

首先您必须定义 insert_statement。 静态 sqlite3_stmt *insert_statement = nil; ...最后你应该用 sqlite3_reset(insert_statement); 重置语句;

【讨论】:

  • 他正在使用 [sql UTF8String] 将其转换为 C 字符指针并且工作正常。
  • @lnafziger 使用sqlite3_bind_text 的目的是为了语义正确,简化转义字符串,并防止注入攻击。
  • @DaveDeLong:虽然我明白了,但它无法解释为什么这在这里不起作用,所以这并不能真正回答问题......
【解决方案2】:

左单引号不适合在 SQLite 中引用标识符或值。用 " (\x22) 引用标识符,用 ' (\x27) 引用数据。

另外,我希望你的程序足够简单,以至于潜在的 SQL 注入无关紧要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多