【问题标题】:Batch insert values to a specific column in sqlite3 on iOS在 iOS 上的 sqlite3 中批量插入值到特定列
【发布时间】:2015-07-09 12:56:45
【问题描述】:

我的数据库中有一个表。我想将值添加到表中的特定列。由于我的表中有数千行,我想我必须使用批量更新。代码是这样的,但我收到语法错误和一条消息,说没有这样的行:

NSString *addProductColQuery = @"ALTER TABLE Sale ADD COLUMN Product text";
[self.dbManager loadDataFromDB:addProductColQuery];

NSString *batchstart = @"BEGIN IMMEDIATE TRANSACTION";
[self.dbManager loadDataFromDB:batchstart];
for (int i = 0; i<self.productInfo.count; i++)
{
    NSString *addValue = [NSString stringWithFormat:@"INSERT INTO Sale (Product) VALUES (%@)",[tempProductArray objectAtIndex:i]];
     [self.dbManager loadDataFromDB:addValue];
}
NSString *batchComit = @"COMMIT TRANSACTION";
[self.dbManager loadDataFromDB:batchComit];

更新: 我已经设法让上面的代码工作,但现在我在 iphone6 上获得了 90% 的 CPU 使用率!我实际上看到了这一点,因为我使用了一个 for 循环来循环查询是完全错误的。有没有办法将值批量插入特定列中的行?

【问题讨论】:

  • 如果您仍然遇到问题,请分享您从sqlite3_errmsg 获得的确切错误消息(或者如果使用sqlite3_exec,您从该调用的第五个参数获得的信息)。

标签: ios sqlite


【解决方案1】:

tempProductArray 中的值是文本值吗?如果是这样,您必须在 SQL 中引用它们:

NSString *addValue = [NSString stringWithFormat:@"INSERT INTO Sale (Product) VALUES ('%@')", tempProductArray[i]];

向您展示了一个快速的解决方案,这实际上是错误的方法。不建议使用stringWithFormat 来构建带有文本值的 SQL。如果这些字符串中的任何一个本身包含撇号字符,则 SQL 将失败。此外,如果这些数据中的任何一个是由最终用户或网络提供的,那么您将面临 SQL 注入攻击。

正确的解决方案是使用sqlite3_prepare_v2 的SQL 不带引号,但使用? 占位符:

NSString *addValue = @"INSERT INTO Sale (Product) VALUES (?)";

然后,在调用sqlite3_step 之前,您将调用sqlite3_bind_text 将文本值绑定到? 占位符。

如果您的 dbManager 不提供该功能,则必须添加它。或者使用像 FMDB 这样开箱即用地提供此功能的库。

【讨论】:

    猜你喜欢
    • 2013-11-10
    • 2011-05-02
    • 2015-10-02
    • 1970-01-01
    • 2010-09-26
    • 2010-11-24
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多