【问题标题】:Insert into different tables in SQlite在 SQlite 中插入不同的表
【发布时间】:2011-02-03 18:46:39
【问题描述】:

我需要在 iPhone 应用程序中但在不同的表中插入一堆数据。表名在此数据中。

这就是我想要做的:

    NSString *statement = @"insert into ? values (?, ?, 0)";
    sqlite3_stmt *compiledStatement;
    if(sqlite3_prepare_v2(database, [statement UTF8String], -1, &compiledStatement, NULL) == SQLITE_OK)
    {
        for(UpdateItems *item in updateData){
            sqlite3_bind_text(  compiledStatement, 1, [item.table UTF8String], -1, SQLITE_TRANSIENT);
            sqlite3_bind_text(  compiledStatement, 2, [item.code UTF8String], -1, SQLITE_TRANSIENT);
            sqlite3_bind_text(  compiledStatement, 3, [item.data UTF8String], -1, SQLITE_TRANSIENT);

            while(YES){
                NSInteger result = sqlite3_step(compiledStatement);
                if(result == SQLITE_DONE){
                    break;
                }
                else if(result != SQLITE_BUSY){
                    break;
                }
            }
            sqlite3_reset(compiledStatement);
        }
    } else  
        printf("db error: %s\n", sqlite3_errmsg(database)); 

    sqlite3_finalize(compiledStatement);
    sqlite3_close(database);

运行上述脚本时,我收到错误:no such table: ? 这是正常的,因为在 sqlite3_prepare_v2 语句中数据尚未绑定,因此 SQLite 不知道该表。

现在我将在循环内移动洞 sqlite3_prepare_v2 块并使用 stringWithFormat 我将使用表名更改第一个问号并在准备好之后,但是有没有其他解决方案 - 更简单?

【问题讨论】:

    标签: xcode sqlite insert


    【解决方案1】:

    这是最简单的正确解决方案。

    但是,不每次都准备查询会带来性能优势。如果性能是一个问题,那么我建议创建一个从表名到准备好的查询的映射。那么你只需要在第一次遇到表名时准备查询即可。

    【讨论】:

    • 谢谢。映射的想法很好。但是,我毕竟使用了最简单的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    相关资源
    最近更新 更多