2013-02-16 99 views
5

我有一个经常访问sqlite数据库的应用程序。它的伟大工程的大部分时间,但偶尔会在我的数据库功能之一失败并返回: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; 
} 
+0

版本不匹配或许? – CodaFi 2013-02-16 07:45:48

+0

我问谷歌和最流行的答案是版本不匹配,但我不明白如何才可能发生这种事情只有有时候这个查询...更新后的示例代码 – VTS12 2013-02-17 15:39:02

+0

@CodaFi - 我敢肯定,SQLite文件版本在多年的时间里并没有以不相容的方式改变。 “版本不匹配”是通常提供的解释,但它不能解释任何内容。 – 2013-02-17 15:47:15

回答

0

当DB文件变得乱码时发生错误。但是,究竟为什么会发生这种情况,这是一个难题。

如果你正在写在你的应用程序的其他文件,你可能不小心覆盖数据库文件。如果你打开相同的数据库文件两次或在DB做两个“同步”操作,您可能能够创造这种情况下(但我认为,SQLite的大多数版本都用代码来检测这一点,并错误编译如果存在冲突,则退出)。 (问题:你有没有得到“数据库被锁定”的错误呢?)

+0

我还写了一个日志文件...但奇怪的是我得到这个错误后,应用程序在下次启动时运行良好,就好像什么也没有发生......我还没有看到数据库被锁定 – VTS12 2013-02-17 16:30:03

+0

@HotLicks与版本不匹配相比,“不知何故”变得更模糊(原则上)?一个乱码的数据库可能是由一些简单的事情引起的,比如不提交事务,以及一些复杂的事情,比如迁移到新版本。 – CodaFi 2013-02-17 16:57:46

+0

@CodaFi - 除非安装了新版本的数据库或SQLite库,否则不会出现版本不匹配(如果可能的话),因此,以前运行良好的应用程序永远不会“发生”。我必须相信,版本不匹配与加密的消息相比,有单独​​的错误消息。 – 2013-02-17 19:14:08

1

要创建一个新的加密SQLite数据库或打开一个现有的加密SQLite数据库,你必须调用sqlite3_key函数或执行一个“编译指示码在执行任何其他数据库操作之前打开数据库后立即执行“=”命令。 我怀疑你试图打开一个现有的数据库,但没有加密的SQLite数据库,并希望通过使用上述方法之一来加密它。这不起作用,但会导致您遇到的错误消息。 要加密现有的未加密的SQLite数据库,您必须使用函数sqlite3_rekey或“pragma rekey =”命令。 要改变,你必须打开数据库的现有的加密SQLite数据库的加密密钥,然后使用sqlite3_key(或“编译键=”),然后申请sqlite3_rekey(或“编译钥=”)。

0

由于无益的“版本不匹配”的意见往往是,我遇到了同样的症状,发现问题是固定由2版本更新数据库,以3可能发生这一问题的原因之一是,数据库的文件扩展名不一定能正确反映真实的版本号。

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

随后使用数据库|在SQLite的管理员新选项创建的我选择版本数据库,文件扩展该版本的约定相匹配。 SQL管理员的错误行为仅在我第一次使用Database | New选项时发生。

0

今天我有同样的问题。

它原来是,我创造了我的数据库称为时间列。将其更改为TimeStamp并且它可以工作。我以为不知何故我的文件已经损坏,所以当我注意到“时间”以蓝色突出显示它是一个保留字时,我正在查看sql代码以生成表(在一个新文件中重做它)。

相关问题