2012-08-08 100 views
1

如果我的應用程序在Mountain Lion上創建了一個新的Core Data存儲(SQLite 3.7.12),當嘗試在Tiger(SQLite 3.1.3)上打開該文件時,該應用程序收到NSPersistentStoreInvalidTypeError錯誤。在Tiger Mac上運行sqlite3命令行工具在打開數據庫時不會產生任何錯誤,但「.dump」命令顯示SQLite認爲它是空的。爲什麼Core Data SQLite存儲不能從OS X 10.8到10.4向後兼容?

但是,如果數據庫是在Tiger上創建的,則可以在Mountain Lion上編輯,然後在Tiger上再次編輯,而不會出現任何問題。

Mountain Lion是否發生了一些變化,使新創建的持久性商店不再向後兼容?還是有一個我可以啓用的設置,以便它們是?據我所知,我沒有使用3.1.3中沒有的更新的SQLite特性,例如預寫式日誌記錄。另外,這在Lion上創建的數據庫不是問題。

更新:SQLite change history顯示版本3.7.10中存在文件格式更改。您應該能夠設置PRAGMA legacy_file_format=ON

當這個標誌是,在一個文件 格式,可讀可寫的SQLite由去 回3.0.0的所有版本都創造了新的SQLite數據庫。

這適用於我直接使用sqlite3。但是,當我通過NSSQLitePragmasOption選項將其設置爲NSPersistentStoreCoordinator時,它似乎被忽略:在Tiger上的sqlite3再次將數據庫視爲空。

回答

1

首先,一個術語問題。根據Wikipedia,我相信你在這裏討論的問題是forward compatibility:「向前兼容的目的在於設計能夠優雅地接受用於其自身更高版本的輸入。」在這種情況下,隨OS X 10.4發佈的sqlite3(3.1.3)版本是否能夠處理由OS X 10.8中較新版本的sqlite3(3.7.12)創建的磁盤數據格式?

根據sqlite3 documentation,sqlite3並沒有承諾磁盤格式將完全向前兼容,只能在極限內向後兼容,也就是說,新版本可以讀取由舊版本生成的數據庫。使用sqlite外殼的一個簡單的數據庫創建示例很容易演示,雖然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版本能夠讀取數據庫文件。我認爲這些格式長期以來一直保持向前兼容,這真是一件好事。看來運氣現在已經用完了。除非Apple在某些地方保證CoreData SQL數據庫在這些OS X版本的範圍內向前兼容,否則您可能需要在應用程序中處理這種兼容性,例如,通過跨數據庫轉儲和重新創建版本。

+0

感謝您的回答。我認爲你對術語是正確的。據我所知,蘋果公司並沒有作出保證,但它通常的工作方式是蘋果明確告訴你什麼時候會發生什麼事情。如果NSPropertyListSerialization或NSKeyedArchiver突然更改格式,將會出現混亂。我已經更新了有關SQLite格式兼容性的信息,我相信他們承諾。 – 2012-08-09 15:32:04