0

sqliteで一度に500件以上のレコードを保存しようとしています。これまでに書いたコードを以下に示します

メソッド名 closeDatabase は、データベースの開いている接続をすべて閉じます。変数 ContactID は、アドレス帳に存在する人々の ContactID が取り込まれた配列に他なりません。

sqlite3_exec(databaseRefObj, "BEGIN TRANSACTION", 0, 0, 0);

                for (NSString *contactID の contactIDstr)
                {
                    const char *insertintoGropsMember = "ここにクエリを挿入";
                    NSString *groupIDstr = [NSString stringWithFormat:@"%d",grpID];

                    [セルフクローズデータベース];

                    if(sqlite3_prepare_v2(databaseRefObj, insertintoGropsMember, -1, &sqlstatement, NULL)==SQLITE_OK)
                    {
                        sqlite3_bind_text(sqlstatement, 1, [groupIDstr UTF8String], -1, SQLITE_TRANSIENT);
                        sqlite3_bind_text(sqlstatement, 2, [contactIDstr UTF8String], -1, SQLITE_TRANSIENT);
                        sqlite3_step(sqlstatement);
                    }
                    そうしないと
                    {
                        成功フラグ = いいえ;
                    }


                    sqlite3_finalize(sqlstatement);
                    sqlite3_close(databaseRefObj);
                }

                sqlite3_exec(databaseRefObj, "END TRANSACTION", 0, 0, 0);

ここではデータ挿入のプロセスが非常に遅いため、どこが間違っているのか、または sqlite のパフォーマンスを最適化するためにどのような手順に従うべきかを知りたいです。

挿入を実行したい列には、いかなる種類のインデックスも使用していないことに注意してください。

4

1 に答える 1

0

あなたのコードにはいくつかの問題があります。

  • 処理中にデータベースを閉じているようです。
  • ステートメントの準備/複数バインディング機能を利用していません。
  • sqlite3が整数値を喜んでバインドする場合、整数をテキストとしてバインドしています

このコードを試してください:

BOOL ok = YES;
sqlite3_exec(databaseRefObj, "BEGIN TRANSACTION", 0, 0, 0);
const char *insertintoGropsMember = "My insert query here";
if (sqlite3_prepare_v2(databaseRefObj, insertintoGropsMember, -1, &sqlstatement, NULL) == SQLITE_OK)
{
    for (NSString *contactIDstr in contactID)
    {
        sqlite3_bind_int(sqlstatement, 1, grpID);
        sqlite3_bind_text(sqlstatement, 2, [contactIDstr UTF8String], -1, 0);
        if (sqlite3_step(sqlstatement) != SQLITE_DONE)
        {
            NSLog(@"Error inserting row: %s", sqlite3_errmsg(databaseRefObj));
            ok = NO;
            break;
        }
        sqlite3_reset(sqlstatement);
    }
    sqlite3_finalize(sqlstatement);

    sqlite3_exec(databaseRefObj, ok ? "COMMIT" : "ROLLBACK", 0, 0, 0);
}
else
{
    NSLog(@"Error preparing statement: %s", sqlite3_errmsg(databaseRefObj));
}
于 2013-02-05T08:26:34.570 に答える