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

データベースをループの外側に開いて、1回だけ呼び出されるようにします。10,000行のループ内で繰り返し呼び出すと、メモリの問題が発生する可能性があります。

各executeUpdateの後に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

トランザクションをコミットする必要があるようです。1 回のトランザクションの行数が制限に達したようです。

于 2012-10-29T09:13:19.550 に答える