1

アプリが Mountain Lion (SQLite 3.7.12) で新しい Core Data ストアを作成するNSPersistentStoreInvalidTypeErrorと、Tiger (SQLite 3.1.3) でファイルを開こうとすると、同じアプリでエラーが発生します。Tiger Mac でコマンド ライン ツールを実行しsqlite3ても、データベースを開くときにエラーは発生しませんが、「.dump」コマンドを実行すると、SQLite がデータベースが空であると認識していることがわかります。

ただし、データベースが Tiger で作成された場合は、Mountain Lion で編集してから、Tiger で再度編集しても問題ありません。

新しく作成された永続ストアが後方互換性を持たないようにするために、Mountain Lion で何か変更がありましたか? または、それらが有効になるように有効にできる設定はありますか? 私の知る限り、3.1.3 にはなかった先行書き込みログなどの新しい SQLite 機能は使用していません。さらに、これは Lion で作成されたデータベースでは問題ではありませんでした。

更新: SQLite の変更履歴は、バージョン 3.7.10 でファイル形式が変更されたことを示しています。PRAGMA legacy_file_format=ONを設定できるはずです:

このフラグがオンの場合、新しい SQLite データベースは、3.0.0 までさかのぼる SQLite のすべてのバージョンで読み書き可能なファイル形式で作成されます。

これは、sqlite3直接使用して機能します。ただし、NSSQLitePragmasOptionオプションを介して に設定するNSPersistentStoreCoordinatorと、無視されるようですsqlite3。Tiger では、データベースが空であると再び認識されます。

4

1 に答える 1

1

まず用語の問題。ウィキペディアによると、あなたがここで話している問題は次のとおりだと思いますforward compatibility。この場合、OS X 10.4 でリリースされた sqlite3 (3.1.3) のバージョンは、OS X 10.8 の新しいバージョンの sqlite3 (3.7.12) によって作成されたオンディスク データ フォーマットを処理できますか?

sqlite3 のドキュメントによると、 sqlite3は、ディスク上のフォーマットが完全に前方互換性があることを約束せず、制限内で後方互換性があることのみを保証します。つまり、新しいバージョンは、古いバージョンで生成されたデータベースを読み取ることができます。10.4 バージョンで作成されたデータベースは10.8sqliteバージョンで読み取ることができますが、その逆は真ではありません。たまたま 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 に答える