nilモデルではNSPersistentStoreCoordinatorを作成できません


96

Core Dataで最初の亀裂があり、デバイスでコードを実行すると次のエラーが発生しますが、シミュレータでは問題なく動作します。

*キャッチされない例外「NSInvalidArgumentException」によるアプリの終了、理由:「nilモデルでNSPersistentStoreCoordinatorを作成できません」

問題を引き起こしているかもしれない私の方法のいくつか:

    - (NSManagedObjectContext *)managedObjectContext
{
    if (__managedObjectContext != nil)
    {
        return __managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil)
    {
        __managedObjectContext = [[NSManagedObjectContext alloc] init];
        [__managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    return __managedObjectContext;
}

/**
 Returns the managed object model for the application.
 If the model doesn't already exist, it is created from the application's model.
 */
- (NSManagedObjectModel *)managedObjectModel
{
    if (__managedObjectModel != nil)
    {
        return __managedObjectModel;
    }
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"RugbyOnTv" withExtension:@"momd"];
    __managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];    
    return __managedObjectModel;
}

/**
 Returns the persistent store coordinator for the application.
 If the coordinator doesn't already exist, it is created and the application's store added to it.
 */
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (__persistentStoreCoordinator != nil)
    {
        return __persistentStoreCoordinator;
    }

    NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"RugbyOnTV.sqlite"];

    NSURL *storeUrl = [NSURL fileURLWithPath:storePath];

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];    
    __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];

    NSError *error = nil;
    __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];


    if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {

        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }    

    return __persistentStoreCoordinator;
}


    - (NSString *)applicationDocumentsDirectory {

        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
        return basePath;
    }

編集

AppleのCoreDataBooksからmanagedObjectContextメソッド(下記)をコピーして貼り付けたところ、動作するようになりました。

- (NSManagedObjectModel *)managedObjectModel {
    if (managedObjectModel != nil) {
        return managedObjectModel;
    }
    managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];    
    return managedObjectModel;
}

ねえ、最初のURLForResourceパラメータに "Model"という単語を追加するのと同じくらい簡単かもしれません...ええ、同じ問題がありました。次に、コマンドラインで実際の.appの内容を確認したところ、.momdが実際に作成されていることがわかりました。だからこれを試してください:[[NSBundle mainBundle] URLForResource:@ "RugbyOnTvModel" withExtension:@ "momd"];
PostCodeism 2012

NSString *basePath = [paths firstObject];
William Entriken 14

回答:


157

元の投稿とまったく同じエラーメッセージが表示されました。私は何時間もこれに取り組んでいました。それは私のAppDelegate.mのこの行でした。

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"[same with name of xcdatamodeld]" withExtension:@"momd"];

このエラーメッセージを検索してこのスレッドを見つけた人は、まずこれを試してください。

[xcdatamodeldの名前と同じ]と表示されていることを確認する必要があります。何らかの理由で、私のモデル名はデータモデル名ではなく、そこにありました。

それを変更し、すぐに動作しました.....

貢献してくれたRock&Mullerに感謝.......あなたは私を救った!!

ガズ。


2
これは私にとってそれがうまくいったコメントです。私のアプリが探していた魔法の名前はblahfrom blah.xcdatamodeldでした。インターネット、そしてstackoverflowに感謝します。
acedanger 2013年

「Model.xcdatamodeld」を引数として「Model」に変更しました。しかし、Xcodeはそれをロードすることを拒否しますが、このファイルは実際にそこにあります!何が起こっているのかわかりません。
Darmen Amanbayev 2013年

ワオ。しばらく頭を叩いてくれてありがとう。
Sani Elfishawy 14

storeURLはどうですか?
MoralCode

54

最初に確認:

NSLog(@"%@", [self managedObjectModel]);

nil値を取得した場合、問題はおそらくここにあります

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"RugbyOnTv" withExtension:@"momd"];

したがって、@ "momd"を@ "mom"に変更してみてください。


1
あなたの右。nullなので、次の行がエラーの原因です: `__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];`ママに変更しても何も修正されないようです
Dominic Williams

3
最も可能性modelURLが高いですnil。最も一般的な原因は、のタイプミスですRugbyOnTv。これは大文字と小文字が区別されることに注意してください。
Rob Napier

1
「momd」を「mom」に変更することも私にとってはうまくいきました。ありがとう。しかし、なぜ?XCodeが機能しないコードを生成するのはなぜですか?基本テンプレートを機能させるために、なぜSOでこのようなあいまいな修正が見つかるのですか?
ルバーブ2009

10
私のモデルの2番目のバージョンを最近導入したので、それをmomdに戻す必要がありました。モデルバージョンコンテナーにxdatamodeldの拡張子があることを考えると、ここで何が起こっているのかを推測できると思います。「momd」は複数のバージョンを持つモデル用であり、「mom」はバージョン管理のないモデル用です。
ジェラルド

2
コードを新しいプロジェクト[iOS7]にそのままコピーしました。元々はmomdでしたが、momに変更すると修正されました。これがなければどのように解決策を見つけたのか私にはわかりません。感謝します:)
Ian Clay

20

Xcode 4.3.2とiOS 5で奇妙な問題を経験しました。

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"NAME_OF_THE_MODEL" withExtension:@"momd"];

有効なURLを返しますが

__managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

nullのNSManagedObjectModelを返します。しかし、ドキュメントを確認した後ところ、NSManagedObjectModelにはファイルが必要なようです。NAME_OF_THE_MODEL.momdは、NAME_OF_THE_MODEL.momファイルを含むディレクトリです。URLを

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"NAME_OF_THE_MODEL" withExtension:@"mom" subdirectory:@"NAME_OF_THE_MODEL.momd"];

その後動作します。Xcodeはそれ自体では機能しないコードを生成するが、奇妙に思える...


1
この特定の問題は、追加のモデルバージョンを作成し、Xcodeが開いている間に手動で削除しようとすると発生します。これにより、何らかの破損が発生します。momdディレクトリ内の特定のモデルバージョンを渡すことはできません。
マイクウェラー

かっこいい@MikeWeller、知っておきたい。momdディレクトリのmomファイルを指すメタデータがどこにあるか知っていますか?
xster 2012

私はそれを削除しようとしていませんでしたが、この問題があり、投稿された解決策がうまくいきました。具体的には、まだそれがnilであるかどうかを確認するチェックを追加し、それが上記のコードを追加したかどうか:if(_managedObjectContext == nil){NSURL * modelURL = [[NSBundle mainBundle] URLForResource:@ "Model" withExtension:@ "mom" subdirectory:@ "Model.momd"]; _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; }
David van Dugteren

19

この問題が発生し、「ママ」を「ママ」に変更しても何も起こりませんでした。これを修正するには、xcdatamodelIdファイルを右クリックし、パッケージの内容を表示して、非表示の.xcurrentversionファイルを削除する必要がありました。

PS:この問題は、データモデルファイルの名前を変更した後にのみ発生し始めました。


2
xcdatamodeldファイルの名前を変更した後、managedObjectModelがnilになる問題に遭遇したすべての人にとって:この答えが最善です!JDxに感謝します。あなたの答えは私を大いに助けてくれました。
ドゥモコ2012

削除する代わりに、最終的に編集して、保存されているファイル名を最新バージョンのyoul xcdatamodelに変更することができます
furins

13

このエラーの別の原因は、Xcodeがビルドにデータモデルを含まない場合があることです。

ターゲットのビルドフェーズを確認し、*。xcdatamodeldファイルがコンパイルソースセクションに含まれていることを確認します。


これで解決しました。
ベントーマス

これは私のために働いた。実際のデバイスではなくシミュレータで動作する場合、その苛立たしいデバッグは困難です!
Bishal Ghimire

9

おそらく起こっているのは、Appleのソースコードからのxcdatamodeldファイルがxcdatamodel(dなし)ファイルになっているため、同じとは見なされないことです。

これを修正する最も簡単な方法は、プロジェクトナビゲーターとメニューバーでxcdatamodelファイルを選択することです。

Editor->Add Model Version...

モデルの新しいバージョンを追加します。新しいバージョンにすべての変更を加えます。

これはXcode 5で動作します


残念ながら、このオプションはXcode 5には存在しません。ここを
abbood

xcdatamodelファイルを選択する必要があることを説明するのを忘れていました。コメントを反映するように回答を編集しました。
Louis Cremen、2014

8

私はdbファイルをに追加することで解決します Copy Bundle Resources

プロジェクトのルートに移動>>ターゲットを選択>>ビルドフェーズ>>バンドルリソースのコピー xcdatamodeldファイルがここに追加されていることを確認してください。

ここに画像の説明を入力してください

投稿された解決策はどれも私にとってうまくいきませんでした。だから、うまくいけば、この投稿はそこにいる誰かを助ける。私のアプリはリリースビルドでクラッシュするだけです。学んだ教訓。常にリリースビルドをテストしてください!

ところで、私はこのSOの投稿が最も役立つhttps://stackoverflow.com/a/6708837/951349を見つけました。


6

@Dominic Williamsでも同じ問題が発生しました

以下でmomdファイル名を変更してみてください(これmanagedObjectModelはデフォルトでメソッドにあります)。これは、[file name].xcdatamodeld作成したファイルと同じです。

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"[same with name of xcdatamodeld]" withExtension:@"momd"];

5

私も同じ問題を抱えていました。解決策は2つの答えの組み合わせでした:

1)「サブディレクトリ」パラメータをURLForResource呼び出しに追加する必要がありました

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"DATAMODEL_NAME" withExtension:@"mom" subdirectory:@"DATAMODEL_NAME.momd"];

2)わからない理由で、プロジェクトのコンパイル時にデータモデルが含まれていませんでした。「ビルドフェーズ/コンパイルリソース」に手動で追加する必要がありました。

上記のソリューションの1つだけでは、アプリケーションが機能しませんでした。


4

あなたが話す問題の解決策は簡単です。モデルのURLで、ファイル拡張子を「momd」ではなく「mom」に変更します。できました。


4

ここですべての解決策を試しましたが、どれもうまくいきませんでした。プロジェクトの名前を変更した後、問題が発生しました。どうやら、Xcodeはコンパイル中に間違った場所で古いmomdファイルを探し続けます。

上記の解決策をすべて試してもうまくいかなかった場合は、.xcdatamodeldファイルの完全パスを確認してください。それが私にとってうまくいきました。


4

私も同じ問題を抱えていました。iOS6では問題なく機能しましたが、iOS5では機能しませんでした。これは私がそれを解決した方法です:

  1. xcodeで新しいモデルバージョンを作成します。(を選択し.xcdatamodeld、[エディター]メニューを開いて、[モデルバージョンの追加...]をクリックします)
  2. コンパイルして、新しいバージョンが機能することを確認します。
  3. 古いバージョンを現在のバージョンとして設定します。(.xcdatamodeldバージョン管理下のコアデータモデルのファイルインスペクターの「現在」)
  4. .xcdatamodeldxcode内のファイルへの参照を削除します
  5. .xcdatamodeldFinderでファイルを右クリックし、[ パッケージの内容を表示] を選択します
  6. 不要な新規.xcdatamodelを削除します
  7. .xcdatamodeldxcodeに再度追加
  8. コンパイルして笑顔

(ここで、モデルバージョンを削除する方法を見つけました:Xcodeで古い/未使用のデータモデルバージョンを削除する方法


タックsåmycket!これはとても役に立ちました。
Michael Dorner、2015年

4

コードを変更せずに問題を解決します。

ファイルをXcodeにドラッグする代わりに、File-> Add Fileを使用してModelName.xcdatamodeldを追加します。

 NSString *path=@"ModelName";

NSURL *modelURL = [NSURL fileURLWithPath:[path stringByAppendingPathExtension:@"momd"]];

model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

1

私の側の問題は、データベース名のいくつかの文字の大文字と小文字を変更したことです。

新しいプロジェクトを開始すると、Xcodeはプロジェクト名からすべてを自動的に設定します。プロジェクトを "Rugbyontv"と呼び始め、後で "RugbyOnTV"に変更することを決定し、検索と置換を行った場合、それは壊れてしまいます。(名前の大文字と小文字が区別されることを指摘してくれたRobへのクレジット)


1

私は何時間も答えを探していましたが、何もうまくいきませんでした。しかし、突然この記事を見つけました。したがって、これによると、問題はAppDelegate.mのこの部分でルートコントローラーを設定することでした。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    ListViewController *rootView = (ListViewController *)self.window.rootViewController;
    rootView.managedObjectContext = self.managedObjectContext;
    return YES;
}

実際、CoreData接続を委任するルートコントローラーを定義する必要があります。また、私の場合、TabBarControllerを他のビューに接続していたため、ターゲットビューのルートコントローラーがTabBarとして定義され、エラーが発生しました。私が変更され

ListViewController *rootView = (ListViewController *)self.window.rootViewController;

ListViewController *rootView = (ListViewController *)self.window.superview;

そしてすべてが働いた。


1

これで問題が解決しないことはわかっていますが、昨日この問題に遭遇し、何時間も悩まされていました。@ Dominic Williamsが投稿した解決策では、ArrayIndexOutOfBoundsException(Objective-Cの同等のものは何でも)を提供してくれました。

私はまだObjective-C / Xcodeがあまり得意ではありませんが、私たちの会社が(ほとんど)外部で開発したiOSアプリに取り組んでいます。残念ながら、彼らはキーボードの使い方を忘れたり、大文字を同じ意味で使用したり、プロパティのスペルを間違えたりしましたが、面倒で戻って変更することはできませんでした。彼らはxcodeプロジェクト名に大文字を使用すべきではなかった場所で使用していました(製品名は大文字を使用していません)。戻って、この大文字をすべて小文字に変更する必要がありました。 ; これには、プロジェクト名、コアデータファイル、数百の変数などが含まれます。

とにかく、これを実行すると、私はこのエラーに遭遇し、解決策はありませんでした。すべてのURL名が正しいこと、プロジェクトがクリーンアップされていること、アプリがアンインストールされていること、電話が再起動されていることなどを確認しました。Macをあきらめて電源を切り、その日は家に帰りました。驚いたことに、私は今朝戻ってきて、すべてがうまくいったようです!

なぜこれが機能したのかはわかりませんが、行き詰まった場合はMacを再起動してみてください。


1

同じ問題のために誰かが行き詰まっている場合。データベースを適切にリンクしていることを確認してください(いくつかの例からコードを直接コピーした可能性があるため)。 AppDelegateのmanagedObjectModelメソッドおよびpersistentStoreCoordinatorメソッドで
データベースの名前を更新するだけです。


1

私は同じ問題を抱えていました、すなわち

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"MyModel" withExtension:@"momd"];

.momdファイルが生成されなかったため、nilが返されました。

その理由は、アプリディレクトリ(例:MyGreatApp / MyGreatApp.app)で、xcodeがMyModel.xcdatamodeldファイルからMyModel.momdを生成する代わりに、MyModel.xcdatamodeldをコピーしたためです(momcを使用)。

解決策は、XCodeプロジェクトブラウザー内のMyModel.xcdatamodeldへの参照を削除し、それをファインダーからプロジェクトにドラッグして戻すことでした。そのxcodeがそれを.momdにコンパイルする必要があることに気づいた後。


1

で生成されたアプリを削除した後、私はどこでもこの問題を抱えていました~/Library/Application Support/iPhone Simulator。どういうわけか、これにより、後続のビルドがシミュレータとデバイスで失敗しました。何年もの間、CoreDataに関連する変更は何もしていませんでしたが、で失敗しましたCannot create an NSPersistentStoreCoordinator with a nil model。上記のいくつかを試してみましたが、何もうまくいきませんでした。

内部にmomファイルがある生成されたmomdフォルダーを確認できました。シミュレーターのアプリは両方を表示できましたが、sqliteファイルの生成に失敗しました。

それを解決したのは、Xcodeのxcdatamodeldファイルのエンティティに属性を追加し、すぐに削除することでした。これにより、Xcodeが問題を引き起こしているものを最初から再生成し、機能するように見えることを望んでいました。実際には何が問題だったのかはまだわかりませんが、私のアプリはシミュレータとデバイスで再び実行されています。


0

IOS5からIOS6へのアップグレードで同様の問題が発生しました。モデル名の大文字と小文字が区別される問題であることがわかりました。

これが誰かを助けるかどうかわかりません。



0

さて、私は最初に半分のソリューションを教えます、あなたがアプリを再インストールすればそれは機能します(シミュレータまたはデバッガデバイスで)。しかし、それは確かに本当の解決策ではありません。たとえば、アプリケーションを更新する場合は、それを行わないでください。そうしないと、ユーザーが再インストールしないために新しいバージョンがクラッシュする可能性があり、代わりに更新ボタンを使用します。

私が理解したように、この問題はデータモデルのファイル名を変更したときに主に発生します。その理由は次のようになります
。アプリを初めて実行すると、「data_model_1」のようなApp Bundleにデータモデルファイルが作成されます。この作成は初めてのみ行われます。
。ファイル名を更新してアプリを再度実行すると、「data_model_1」ファイルがまだ存在しているので見つけることができませんが、「data_model_2」を探すように指示しています。どのようにして見つけることができますか?それはまだ作成されていませんし、新しいファイル名でアプリをインストールしない限り作成されません。

したがって、これがアプリの最初のバージョンであり、シミュレーターまたはデバイスに再インストールしてもプロジェクトに害が及ばない場合は、それを試してください。それ以外の場合は、iOS開発者ライブラリのコアデータモデルのバージョン管理とデータ移行ガイドを確認してください。おそらくそれが必要なものです。

編集:再インストールが機能しない場合は、まずアンインストールしてからプロジェクトをクリーンアップしてから、すべてを閉じて、プロジェクトを再度開いてビルドして実行してください。うまくいくはずです。


0

プロジェクトがシミュレータでは機能するがデバイスでは機能しない場合は、デバッグビルドではなくデバイスでリリースビルドを実行してみてください。

プロジェクトを選択->製品->スキームの編集->ビルド構成[デバッグ->リリース]

ここでプロジェクトを再度実行すると、機能します。


0

私もこの問題に直面していますが、ModelName.xcdatamodeldファイルを変更すると機能します。ModelName.xcdatamodeld ファイルが適切に追加されていないと思うので、一度アプリをチェックしてクリーンアップし、実行します。


0

名前の問題を修正した後も、エラーは残りました。次に、Xcode 5を再起動した後に機能しました。これは、ここで提供されている手動リンクの提案の一部と同じことを自動的に行う可能性があります。


0

私にとって問題は、サンドボックスプロジェクトから実際のプロジェクトにモデルをコピーして貼り付けたという事実によるものでした。モデルが使用されているプロジェクト内から必ずモデルを生成してください。


0

私が名前を変更したときに私はこれと同じエラーに直面しまし.xcdatamodelのXcodeからファイルを、それが必要だったところはどこでもアプリデリゲートに名前を変更した名前を変更しましたが、私はまだ同じエラーを得ました。提案された手順のどれも私にはうまくいきませんでした。

次に、フォルダを開いて、Finderファイル.xccurrentversionとともに追加のファイルを見つけました.xcdatamodel。私はそれをTextEditアプリで開いてこれを変更しました:

<dict>
    <key>_XCCurrentVersionName</key>
    <string>Your_Renamed_Model_FileName.xcdatamodel</string>
</dict>

Xcode 6.4、OSX Yosemite 10.10.1でこれを使用しています

お役に立てば幸いです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.