Ios SQLite“;“数据库磁盘映像格式不正确”;

Ios SQLite“;“数据库磁盘映像格式不正确”;,ios,objective-c,sqlite,wrapper,ios7.1,Ios,Objective C,Sqlite,Wrapper,Ios7.1,我遇到了一个应用程序的问题,其中SQLite数据库正在损坏。以前也有这种奇怪的情况,但在iOS 7.1发布后,这种情况似乎变得更加普遍 我使用的是Matteo Bertozzi的SQLite包装,您可以在这里找到: 数据库损坏并抛出错误数据库磁盘映像格式不正确,可以运行某些查询,但现有数据会出错 我到处搜索,找不到解决方案,我希望这里的人有一些想法,因为在iOS更新后,这已经成为一个更常见的问题 我尝试了以下修复命令: [sqlite executeNonQuery:@"pragma integ

我遇到了一个应用程序的问题,其中SQLite数据库正在损坏。以前也有这种奇怪的情况,但在iOS 7.1发布后,这种情况似乎变得更加普遍

我使用的是Matteo Bertozzi的SQLite包装,您可以在这里找到:

数据库损坏并抛出错误
数据库磁盘映像格式不正确
,可以运行某些查询,但现有数据会出错

我到处搜索,找不到解决方案,我希望这里的人有一些想法,因为在iOS更新后,这已经成为一个更常见的问题

我尝试了以下修复命令:

[sqlite executeNonQuery:@"pragma integrity_check"];
[sqlite executeNonQuery:@"reindex nodes"];
[sqlite executeNonQuery:@"reindex pristine"];
结果是:

SQLite Step Failed: database disk image is malformed
SQLite Prepare Failed: unable to identify the object to be reindexed
 - Query: reindex nodes
SQLite Prepare Failed: unable to identify the object to be reindexed
 - Query: reindex pristine`
通过进一步挖掘,我发现了这个问题:它提到了iOS7之后SQLite的问题

虽然我不知道如何使用
NSPersistentStore
,但我尝试运行
[sqlite executeNonQuery:@“pragma journal_mode=DELETE”]它只是说
SQLite步骤失败:未知错误

有没有其他人经历过这种情况,或者给我指出了正确的方向

与此同时,我觉得这是我应该做的事。。我得调查一下

编辑:

据我所知,只有当数据库不更新时,才使用
NSPersistentStore
,而我的数据库是定期更新的

以下是我打开数据库的方式:

sqlite = [[Sqlite alloc] init];

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"HomeOpenDatabase8.sql"];

if (![sqlite open:writableDBPath]) {
    NSLog(@"DB Not Writable");
    return;
} else {
    NSLog(@"All good");
}
因此,我假设我需要找到一种方法来设置
pragma journal\u mode=DELETE
这种方式

编辑2:

我不相信这与
日志模式有关,因为我没有使用
核心数据
-回到绘图板


对我来说,最大的标志是这个错误在iOs 7.1发布后很快就出现了,这肯定不是巧合。。我将继续尝试在我的设备上复制此问题。

我在使用FMDB的iOS 7.0.6上也遇到了此问题。我通过复制到Mac并使用以下命令修复了它:

[sqlite executeNonQuery:@"pragma integrity_check"];
[sqlite executeNonQuery:@"reindex nodes"];
[sqlite executeNonQuery:@"reindex pristine"];

我的数据库转储相当大,为200MB,因此我使用Hexfiend来剪切事务和回滚命令


在您的情况下,您可以考虑检查<强>完整性检查<强>结果。这就是我解决问题的方法。

您是否可以执行某些步骤来可靠地复制损坏?我自己无法复制它,这是一个巨大的痛苦,尽管我将继续尝试。我不再相信这是
日志模式
,因为我没有使用
核心数据
,所以它又回到了原点。你为什么要搞乱pragmas?我想你可能是无意中开始以多线程模式访问数据库了。即使在“线程安全”的情况下,SQLite实际上也无法处理完整的多线程——您必须至少提供外部同步,以确保两个线程不会同时在DB上运行。据我所知,“线程安全”所做的只是启用检查,如果您尝试同时访问,这些检查通常会抛出错误。您是对的。我在我的DB服务中添加了锁定功能,以便只通过一个线程访问SQLite DB,现在它可以工作了。您是如何将DB文件从iPhone复制到Mac的?@de_la_vega_66您可以通过iTunes执行此操作,或者如果您有XCode,则搜索“管理设备上的容器”: