0

我正在尝试在 sqlite 中一次保存 500 多条记录,我到目前为止编写的代码如下所示

方法名称 closeDatabase 关闭数据库的任何打开连接,变量 ContactID 只不过是一个数组,其中填充了我通讯录中存在的人员的 ContactID。

sqlite3_exec(databaseRefObj, "开始交易", 0, 0, 0);

                for (NSString *contactIDstr in contactID)
                {
                    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 回答