5

我有一个经常访问 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;
}
4

4 回答 4

1

To create a new encrypted SQLite database or to open an existing encrypted SQLite database you have to call the function sqlite3_key or to execute a "pragma key=" command immediately after opening the database before performing any other database operation. I suspect that you tried to open an existing database, but not encrypted SQLite database and expected to encrypt it by using one of the above methods. This doesn't work but results in the error message you experienced. To encrypt an existing not encrypted SQLite database you have to use function sqlite3_rekey or "pragma rekey=" command. To change the encryption key of an existing encrypted SQLite database you have to open the database, then to use sqlite3_key (or "pragma key=") and then to apply sqlite3_rekey (or "pragma rekey=").

于 2013-04-02T12:17:41.467 回答
0

我今天遇到了同样的问题。

事实证明,我在我的数据库中创建了一个名为 Time 的列。将其更改为 TimeStamp 并且它有效。我认为不知何故我的文件已损坏,所以当我注意到“时间”以蓝色突出显示表示它是保留字时,我正在查看生成表的 sql 代码(在新文件上重做它)。

于 2014-03-29T00:31:10.357 回答
0

与“版本不匹配”的建议一样无益,我遇到了同样的症状,发现问题已通过将数据库从版本 2 更新到 3 得到解决。可能出现此问题的原因之一是数据库不一定正确反映真实的版本号。

我可能弄错了,但是当我使用 SQLite Administrator 版本 0.8.3.2 创建我的第一个 SQLite 数据库并接受 SQLite3 DB 的默认“另存为类型”时,它创建的文件显然是版本 2 DB,尽管具有 .s3db 名称。在“数据库”菜单下,启用了“迁移到 SQLite3”项,但我认为这是 GUI 中的错误。但是,在使用该功能后,我的问题就消失了。

随后在 SQLite Administrator 中使用 Database|New 选项会创建一个我选择的版本的数据库,并且文件扩展名与该版本的约定相匹配。SQL Administrator 的错误行为只发生在我第一次使用 Database|New 选项时。

于 2013-04-10T04:17:17.130 回答
0

当数据库文件以某种方式变得乱码时会发生错误。然而,究竟为什么会发生这种情况有点令人费解。

如果您在应用程序中写入其他文件,您可能不小心覆盖了 DB 文件。如果您要两次打开同一个数据库文件或在数据库上执行两个“同时”操作,您可能能够创建这种场景(但我认为大多数版本的 SQLite 都使用代码编译以检测这一点并在有冲突)。(问题:您是否曾经收到“数据库已锁定”错误?)

于 2013-02-17T15:52:04.830 回答