iOS应用程序使用EXC_BAD_INSTRUCTION在sqlite3_reset上崩溃

时间:2017-08-07 03:58:01

标签: ios sqlite

由于以下行中的EXC_BAD_INSTRUCTION(代码= EXC_i386_INVOP)错误,我的iOS应用终止于Xcode模拟器

sqlite3_reset(stmt);

完整的代码块是

-(BOOL)containsPendingSignature
{
sqlite3_stmt *stmt = nil;

const char* sql = "SELECT Count(*) FROM pending_signatures";
if(sqlite3_prepare_v2(database, sql, -1, &stmt, NULL) != SQLITE_OK)
NSAssert1(0, @"Error:'%s'", sqlite3_errmsg(database));


int rowCount = 0;
if(sqlite3_step(stmt) == SQLITE_ROW) {
    rowCount = sqlite3_column_int(stmt, 0);
}

sqlite3_reset(stmt);
sqlite3_finalize(stmt);
return rowCount > 0;
}

任何人都可以在这里提出错误的建议,提前谢谢。

1 个答案:

答案 0 :(得分:2)

此类问题的解决方案是,您可能会遗漏以下声明。

 sqlite3_finalize(statement);
        sqlite3_close(database);
每次

sqlite3_open()
sqlite3_prepare_v2()

我们应该总是在返回语句之前完成语句并关闭数据库。不要让数据库保持打开状态。 如果您尝试再次打开它sqlite3_open()

,则不会结束语句而不关闭数据库

sqlite3_prepare_v2()

这将导致EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)关于数据库。

 -(BOOL)containsPendingSignature
    {
    sqlite3_stmt *stmt = nil;

    const char* sql = "SELECT Count(*) FROM pending_signatures";
    if(sqlite3_prepare_v2(database, sql, -1, &stmt, NULL) != SQLITE_OK)
    NSAssert1(0, @"Error:'%s'", sqlite3_errmsg(database));


    int rowCount = 0;
    if(sqlite3_step(stmt) == SQLITE_ROW) {
        rowCount = sqlite3_column_int(stmt, 0);
    }

     sqlite3_finalize(statement);
     sqlite3_close(database);
    return rowCount > 0;
    }

我希望这会对你有帮助....