【问题标题】:Loop through SQLite_master table and delete tables循环遍历 SQLite_master 表并删除表
【发布时间】:2012-03-16 19:52:39
【问题描述】:

下面的代码部分有效。它应该返回 sqlite_master 表中的所有表,然后删除它们。

 NSString *sql = [NSString stringWithFormat:@"SELECT name FROM sqlite_master WHERE type='table';"];

        sqlite3_stmt *statement = [database prepare:sql];
        if(statement != nil)
        {
            while(sqlite3_step(statement) == SQLITE_ROW)
            {
                NSString* currentTable = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0)];
                if ([currentTable rangeOfString:@"sqlite"].location == NSNotFound && 
                    [currentTable rangeOfString:@"Setting"].location == NSNotFound)
                {
                    NSLog(@"current table: %@", currentTable);
                    [database deleteTable: currentTable];
                }
            }
            sqlite3_finalize(statement);
        }

但是,在调用[database deleteTable: currentTable]; 之后,表并没有被删除。

删除表只是一个接受 sql 的sqlite3_exec[NSString stringWithFormat:@"DROP TABLE IF EXISTS '%@'", tableName]

这是为什么?是因为当我在循环中时数据库正在使用中?我会更好地将结果放在一个数组中,而不是这样循环和删除表吗?没有抛出异常/崩溃等,并且正在执行 exec。

【问题讨论】:

    标签: iphone objective-c sql ios sqlite


    【解决方案1】:

    尝试在每次删除后使用sqlite3_finalize 完成。

    希望对你有所帮助。

    【讨论】:

    • 我假设您的意思是在删除时完成 sqlite3_exec 而不是语句?
    • 是的。我发现你真的必须在任何影响数据库的调用之后调用 finalize。
    猜你喜欢
    • 2010-09-23
    • 2019-11-07
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    相关资源
    最近更新 更多