1

NSPersistentStoreInvalidTypeError如果我的应用程序在 Mountain Lion (SQLite 3.7.12) 上创建了一个新的核心数据存储,则同一应用程序在尝试在 Tiger (SQLite 3.1.3) 上打开文件时会收到错误消息。在 Tiger Mac 上运行sqlite3命令行工具在打开数据库时不会产生任何错误,但是 ".dump" 命令显示 SQLite 认为它是空的。

但是,如果数据库是在 Tiger 上创建的,则可以在 Mountain Lion 上进行编辑,然后在 Tiger 上再次进行编辑,没有任何问题。

Mountain Lion 中是否发生了一些变化,以至于新创建的持久性存储不再应该向后兼容?或者是否有我可以启用的设置以便它们启用?据我所知,我没有使用任何较新的 SQLite 功能,例如 3.1.3 中没有的预写日志记录。此外,这不是在 Lion 上创建的数据库的问题。

更新:SQLite 更改历史显示版本 3.7.10 中存在文件格式更改。您应该能够设置PRAGMA legacy_file_format=ON

当这个标志打开时,新的 SQLite 数据库将以一种文件格式创建,该文件格式可由所有 SQLite 版本(回到 3.0.0)读写。

这适用于我sqlite3直接使用。但是,当我通过NSSQLitePragmasOption选项设置它时,NSPersistentStoreCoordinator它似乎被忽略了:sqlite3在 Tiger 上再次将数据库视为空。

4

1 回答 1

1

首先,术语问题。根据Wikipedia的说法,我相信您在这里谈论的问题是forward compatibility:“前向兼容性旨在让设计能够优雅地接受为其后续版本设计的输入。” 在这种情况下,与 OS X 10.4 一起发布的 sqlite3 (3.1.3) 版本是否能够处理 OS X 10.8 中更新版本的 sqlite3 (3.7.12) 创建的磁盘数据格式?

根据sqlite3 文档,sqlite3 不承诺磁盘格式将完全向前兼容,仅在限制范围内向后兼容,即新版本可以读取旧版本生成的数据库。仅使用 shell 就可以通过一个简单的数据库创建示例来简单地演示sqlite,虽然 10.4 版本创建的数据库可以被 10.8 版本读取,但反之则不然。碰巧我有一台 10.4 机器(ppc),它恰好有一个最新版本的 sqlite3 以及 Apple 提供的系统版本:

$ /macports/bin/sqlite3 -version
3.7.13 2012-06-11 02:05:22 f5b5a13f7394dc143aa136f1d4faba6839eaa6dc
$ /macports/bin/sqlite3 test.db <<EOF
>      BEGIN TRANSACTION;
>      CREATE TABLE t1 (t1key INTEGER
>                   PRIMARY KEY,data TEXT,num double,timeEnter DATE);
>      INSERT INTO "t1" VALUES(1, 'This is sample data', 3, NULL);
>      INSERT INTO "t1" VALUES(2, 'More sample data', 6, NULL);
>      INSERT INTO "t1" VALUES(3, 'And a little more', 9, NULL);
>      COMMIT;
> EOF
$ /macports/bin/sqlite3 test.db  "select * from t1 limit 2";
1|This is sample data|3.0|
2|More sample data|6.0|
$ /usr/bin/sqlite3 test.db  "select * from t1 limit 2";
SQL error: unsupported file format
$ /usr/bin/sqlite3 -version
3.1.3

如果数据库是在 10.8 上创建然后移动到 10.4,也会发生同样的事情。当使用 10.7 版本的 sqlite3 (3.7.7) 运行相同的测试时,10.4 版本能够读取数据库文件。我认为这些格式一直保持前向兼容已经很幸运了。看来现在运气已经用完了。除非 Apple 在某处保证 CoreData SQL 数据库在这些 OS X 版本范围内向前兼容,否则您可能需要在应用程序中处理这种兼容性,例如,通过跨平台转储和重新创建数据库版本。

于 2012-08-08T20:53:51.787 回答