【问题标题】:Problems writing strings in sqlite database在 sqlite 数据库中写入字符串的问题
【发布时间】:2011-11-09 16:17:19
【问题描述】:

我正在使用这个数据库,我遇到了一个奇怪的问题...如果我尝试插入一个单词作为项目名称,一切正常,但如果单词是 2 个或更多,它会失败!

这是代码的一部分:

NSString *insertStatementsNS = 
    [NSString stringWithFormat: @"insert into \"shoppinglist\" 
    (item, price, groupid, dateadded) values (\"%@\", %@, %d, DATETIME('NOW'))",
    name_field, price_field, [groupPicker selectedRowInComponent:0]];

我猜问题出在 --> \"%@\"

有人可以帮帮我吗?

#

我按照上面的步骤操作,但是出了点问题,现在我在这里遇到了这个新错误:

NSString *itemValue = [[NSString alloc] initWithUTF8String: (char*) sqlite3_column_text(dbps, 1)];

程序在启动时停止...它无法再从数据库中读取...发生了什么?

#

好的,感谢一位朋友……我们刚刚重置了模拟器内存​​。 而且我们还解决了这个问题……以另一种方式工作。

我没有使用变量“name_field”,而是使用了“itemNameField.text”(直接指向源...)并且由于某种原因它有效!

【问题讨论】:

  • 尝试单引号而不是双引号。 '%@'

标签: iphone objective-c database sqlite


【解决方案1】:

您应该避免直接为 sql 语句中的列赋值。相反,您应该使用 prepared statementbind 值。

sqlite3_stmt  *stmt = nil;
NSString *sqlStr = @"insert into shoppinglist(item, price, groupid, dateadded) 
                   values (?, ?, ?, DATETIME('NOW'))";
char *sql = (char *) [sqlStr UTF8String];

if (sqlite3_prepare_v2(DB, sql, -1, &stmt, NULL) != SQLITE_OK) {

    NSAssert1(0, @"Error Preparing Statement: %s", sqlite3_errmsg(DB));
}

sqlite3_bind_text(stmt, 1, name_field, -1, SQLITE_TRANSIENT);
sqlite3_bind_text(stmt, 2, price_field, -1, SQLITE_TRANSIENT);
sqlite3_bind_int(stmt, 3, [groupPicker selectedRowInComponent:0]);
...

使用准备好的语句总是安全的,如果你直接替换字符串值并且如果字符串值包含特殊字符,如双引号(""),那么在执行 sql 时会出现不希望的结果。但是,如果您使用准备好的语句,您不必担心您绑定的值的实际内容。这些值将安全地添加到数据库中。

【讨论】:

    【解决方案2】:

    只需使用 '%@'

    NSString *insertStatementsNS = 
    [NSString stringWithFormat: @"insert into \"shoppinglist\" 
    (item, price, groupid, dateadded) values ('%@', %@, %d, DATETIME('NOW'))",
    name_field, price_field, [groupPicker selectedRowInComponent:0]];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多