web-dev-qa-db-ja.com

コアデータ-パスで最適化されたモデルをロードできませんでした

IOS 9ベータ5を搭載したiPhone 6でXcode 6からアプリケーションを実行しているときに、コンソールでこれらのプリントの一部を取得しています。

CoreData:パス '/var/mobile/Containers/Bundle/Application/0000000B-BDBC-0000-000B-0000FB00000B/Distribution.app/database.momd/database.omo'で最適化されたモデルをロードできませんでした

これに関連するものは見つかりませんでしたが、このメッセージについて誰か手がかりがありますか?

69
Glauco Neves

私はこの問題に遭遇し、いくつか掘り下げました。

私はXcode 6.4でビルドしてきましたが、以前のコアデータではMyApp.ipa momdディレクトリに.momファイルしか生成されなかったようです。このスクリーンショットは、Xcodeのいくつかのバージョンを見たプロジェクトのものです。

すべての古いモデルバージョンには.momファイルしかありません。今日、新しいモデルバージョンを作成したところ、.momファイルと.omoファイルの両方が含まれています。

enter image description here

Xcode 6.4(およびおそらくベータ7.xバージョンの一部も)は、データモデルの最適化されたバージョンを読み込む方法を知らないようです。

2015-10-16 11:11:42.563 MyAppName[1767:599635] CoreData: Failed to load optimized model at path '/var/mobile/Containers/Bundle/Application/D887D60B-FB28-4059-8167-F573460D98F8/MyAppName.app/MyDataModel.momd/MyDataModel3_0Analytics.omo'

6.4でコンパイルする際の警告。ただし、Xcodeの最新のアプリストアバージョン(7.0.1)でアプリをコンパイルすると、その警告は表示されません。 Maheshのソリューションが機能している理由は、スキーマ全体を書き換えると、アプリがアプリバンドルで探している.omoファイルを作成するからだと推測しています。

私にとっての解決策は、コアデータで新しいデータモデルバージョンを生成し、Xcode 7でビルドすることでした。新しいモデルバージョンを作成すると、最適化されたモデルファイルが作成されるようです。しかし、私のテストでは、このファイルを作成しても、Xcode 6.4はエラーをスローします。警告が消えたのは、Xcode 7.0.1で試したときでした。

これは推測ですが、既存のプロジェクトがあり、新しいデータモデルバージョンを作成せず、Xcode 7でビルドしていない場合、.omoファイルが見つからないため、ファイルが見つからないため警告がスローされていると思います。ただし、データモデルをバージョン管理してXcode 6.4でビルドした場合、以前のXcodeバージョンは最適化されたバージョンでは正常に動作せず、たとえそこにあったとしてもロードされないようです。これらは私の観察です。

以下を実行して、ロードする最適化モデル(.omoファイル)があることを確認しました。1.プロジェクトをアーカイブする2. .ipa拡張子を.Zipに変更する3. Zipファイルを展開する4.「payload」フォルダーをクリックするフォルダー内のアプリバンドルを右クリック(またはcmdクリック)し、[パッケージの内容を表示]を選択します。 5. .momdディレクトリをクリックすると、使用可能な管理オブジェクトモデルがすべて表示されます。

持っているのが.momファイルのみで、.omoファイルがない場合、警告は完全に意味があり、アプリは存在しないファイルを開くことができません。

私のテストでは、警告は単なる情報提供のようでした。そのためクラッシュすることはありませんでした。コアデータが最適化されたモデルを最初にロードしようとし、それが失敗すると通常の.momdモデルにフォールバックするようです。これは単なる推測です。

ここですべてが完全に正しいかどうかはわかりません。これは、これをデバッグしようとして今まで見たものです。他の誰かがこれ以上の情報を提供できるなら、あなたの意見を歓迎します。

11
digitalHound

今朝、この問題に遭遇しました。実行するために小さなハックをしました。バージョン管理の不一致と関係があると思いますが、よくわかりません。

とにかく、momd-fileをロードする場合、NSURLに「/[filename].mom」を追加するだけで機能します。

私の場合、Countly.momdファイルを読み込んでいて、これを実行していました。

// Original loading
NSURL modelURL = [[NSBundle bundleForClass:[CountlyDB class]] URLForResource:@"Countly" withExtension:@"momd"];

// Small hack
modelURL = [modelURL URLByAppendingPathComponent:@"Countly.mom"];

更新:CoreDataを使用したPODを使用していました。レポからポッドを削除してソースなどを直接追加すると、問題はなくなりました。

したがって、ポッドの問題である可能性があります。

4
DiAvisoo

これに対する解決策を見つけました。スキーマ全体を書き直し、コードを実行したときに、コアデータからこれらの警告を取り除きました。

これを試す前にバックアップを取ることをお勧めします。

お役に立てば幸いです。

3
Mahesh

独自のCoreDataモデルを持つ独自のポッドを書いていたときにこれに遭遇した人々に答えたいと思います。おそらく、あなたはモデル定義をバンドルに入れましたが(それで良いのですが)、間違ったバンドルでmomdファイルを検索します。

Podspecで次のようにバンドルを定義したとしましょう:

'MYPodBundle' => [
    'Model/*.{xcdatamodeld,xcdatamodel}'
]

次に、最初にこのバンドルを見つけてから、モデルを探しますinside it

NSURL *bundleURL = [[NSBundle bundleForClass:[MYEntity class]] URLForResource:@"MYPodBundle" withExtension:@"bundle"];
NSBundle *bundle = [NSBundle bundleWithURL:bundleURL];
NSString *modelPath = [bundle pathForResource:@"MYCoreDataModel" ofType:@"momd"];
NSManagedObjectModel *managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[NSURL fileURLWithPath:modelPath]];

したがって、CoreDataスタックの作成を続行できます。

//これは、あなた自身のポッドを書いていなかったので少し話題から外れているかもしれませんが、あなたの答えはグーグルのトップにあります。

0
ReDetection