如果我的应用程序在山狮上创建了一个新的核心数据存储库(SQLite 3.7.12),那么在试图打开老虎上的文件(SQLite 3.1.3)时,同一个应用程序会收到一个NSPersistentStoreInvalidTypeError错误。在Tiger上运行sqlite3命令行工具在打开数据库时不会产生任何错误,但是".dump“命令显示SQLite认为它是空的。
但是,如果数据库是在Tiger上创建的,那么它可以在山狮上编辑,然后再在Tiger上编辑,而不会有任何麻烦。
是不是山狮发生了一些变化,使得新创建的持久存储不再应该向后兼容?或者,是否有我可以启用的设置,以便使它们能够启用?据我所知,我没有使用任何新的SQLite特性,比如3.1.3中缺少的预写日志。此外,这与在Lion上创建的数据库无关。
更新:SQLite变更史显示3.7.10版本中的文件格式发生了变化。您应该能够设置format=ON
当此标志打开时,新的SQLite数据库将以可读和可写入的文件格式创建,所有版本的SQLite都可以追溯到3.0.0。
这对我直接使用sqlite3很有用。但是,当我通过NSSQLitePragmasOption选项将其设置为NSPersistentStoreCoordinator时,它似乎被忽略了:老虎上的sqlite3再次将数据库视为空的。
发布于 2012-08-08 20:53:51
首先是术语问题。根据维基百科的说法,我认为您在这里讨论的问题是forward compatibility:“前向兼容性旨在使设计能够优雅地接受为其自身后期版本准备的输入。”在这种情况下,用OSX10.4发布的sqlite3 (3.1.3)版本是否能够处理OSX10.8中较新版本的sqlite3 (3.7.12)创建的磁盘数据格式?
根据sqlite3文档的说法,sqlite3没有承诺磁盘上的格式将是完全前向兼容的,只能在限制范围内向后兼容,也就是说,较新的版本可以读取旧版本产生的数据库。简单地用一个简单的数据库创建示例来演示,仅使用sqlite shell,虽然10.4版本创建的数据库可以被10.8版本读取,但是相反的情况并非如此。碰巧,我有一台10.4机器(ppc),它有最新版本的sqlite3,以及苹果提供的系统版本:
$ /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版本能够读取数据库文件。我认为这只是幸运的是,格式一直保持向前兼容这么长时间。现在看来运气已经用完了。除非苹果已经在某个地方保证CoreData SQL数据库在OS发行版的范围内是向前兼容的,否则您可能需要在应用程序中处理这种兼容性问题,例如,通过跨版本转储和重新创建数据库。
https://stackoverflow.com/questions/11872027
复制相似问题