4

我正在尝试向我的 SQLite 数据库(使用 fmdb)添加 10k 行,但写入在 1000 行时停止。而且我没有任何错误或警告。我的代码:

NSString *queryString = [NSString stringWithFormat:@"insert into histories (storyid, text, date, storyurl) values (%li, ?, ?, ?)",history.storyIndex];
if ([self.db open]) {
    if([self.db executeUpdate:queryString, history.storyText, history.storyDate, history.storyUrl]) {
        NSLog(@"history added");
    } 
}

有什么建议么?

4

4 回答 4

3

对于任何有同样问题的人...确保您的 sqlite 查看器不会将查询的输出限制为 1000 个结果。

只是因为同样的问题浪费了几分钟,答案就这么简单!

于 2013-07-12T11:30:05.120 回答
1

数据库放在循环之外打开,以便只调用一次。在 10,000 行的循环内重复调用它可能会导致内存问题。

每次执行更新后检查 db 对象上的 lastErrorCode,如果 lastErrorMessage 不为零,则 NSLog 记录它。

通过增加一个计数器并使用模数运算来间隔提交,例如

counter++;
if (mod(counter,500) ){
    [self.db commit];
}

考虑使用 python 在 iOS 项目之外批量加载数据库。

于 2012-10-29T10:58:56.767 回答
1

您可以尝试以下代码,看看是否有任何变化:

NSString *queryString = @"INSERT INTO histories (storyid, text, date, storyurl) 
VALUES ( ?, ?, ?, ?)";

BOOL executeUpdateStatus = NO;

if ([self.db open]) 
{
    executeUpdateStatus = [self.db executeUpdate:queryString, 
    [NSNumber numberWithLong:history.storyIndex], history.storyText,
    history.storyDate, history.storyUrl];


        if(executeUpdateStatus == YES)   
            NSLog(@"history added");
        else
            NSLog(@"history NOT added");
}
于 2012-10-29T11:03:38.700 回答
0

听起来您需要提交交易。您似乎已达到单个事务中的行数限制。

于 2012-10-29T09:13:19.550 回答