sqlite随机文件已加密或不是数据库

VTS*_*S12 5 sqlite iphone ios

我有一个经常访问sqlite数据库的应用程序.它在大多数情况下工作得很好但偶尔在我的一个数据库函数中失败并返回:

文件已加密或不是数据库

我没有启用任何加密,但我无法确定这是怎么回事.它不是一贯可重复的,并且从崩溃日志中,它发生在主线程上.

提前致谢.

@synchronized(self) {
    sqlite3 *database = mydb;
    int result = 0;

    static sqlite3_stmt *stmt = nil;
    if (stmt == nil) {
        const char *sql = "select sum(not isAvailable) from table1 e inner join table2 f on e.key=f.pk where f.pk=? AND e.isDeleting=0;";
        if (sqlite3_prepare_v2(database, sql, -1, &stmt, NULL) != SQLITE_OK) {
            NSAssert1(0, @"Error: failed to prepare statement with message '%s'.", sqlite3_errmsg(database));
        }
    }

    sqlite3_bind_int(stmt, 1, obj.primaryKey);

    if (sqlite3_step(stmt) == SQLITE_ROW) {
        int val = sqlite3_column_int(stmt, 0);
        result = val;
    } else {
        [NSException raise:@"SQL Fail" format:@"SQL Failed: %s", sqlite3_errmsg(database)];
    }
    // Reset the statement for future reuse.
    sqlite3_reset(stmt);

    return result;
}
Run Code Online (Sandbox Code Playgroud)

Hot*_*cks 0

当数据库文件因某种原因变得乱码时,就会发生该错误。然而,究竟为什么会发生这种情况,还是有点令人困惑。

如果您在应用程序中写入其他文件,则可能会意外覆盖 DB 文件。如果您要打开同一个数据库文件两次或在数据库上执行两个“同时”操作,您可能能够创建这种情况(但我认为大多数版本的 SQLite 都使用代码进行编译来检测此情况并在以下情况下出错)有冲突)。(问题:您是否遇到过“数据库已锁定”错误?)

  • @VTS12 - 如果下次运行时一切正常,则表明堆管理存在问题,并且 SQLite 控制结构或缓冲区正在被破坏,而不是数据库本身。 (2认同)