web-dev-qa-db-ja.com

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

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;
    }

[〜#〜] edit [〜#〜]

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

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

元の投稿とまったく同じエラーメッセージが表示されました。何時間もこれと格闘していた。 AppDelegate.mのこの行でした。

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

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

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

それを変更し、すぐに働きました.....

貢献してくださったRock&Mullerに感謝します。

ガズ。

157
Gareth Lloyd

最初の検証:

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

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

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

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

54
D33pN16h7

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を返します。しかし documentation を確認した後、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はそれ自体では動作しないコードを生成するのですが、奇妙に思えます...

20
xster

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

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

19
JDx

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

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

13
Dave Wood

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

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

Editor->Add Model Version...

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

これはXcode 5で動作します

9
Louis Cremen

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

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

enter image description here

投稿されたソリューションはどれも私にとってはうまくいきませんでした。したがって、この記事が誰かの助けになることを願っています。私のアプリは、リリースビルドでのみクラッシュします。学んだ教訓。リリースビルドを常にテストしてください!

ところで、私はこれを見つけましたSO最も有用な投稿 https://stackoverflow.com/a/6708837/951349

6
smileBot

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

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

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

同じ問題がありました。解決策は2つの答えが混在したものでした。

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

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

2)私が知らない理由で、プロジェクトのコンパイル時にデータモデルが含まれていませんでした。 「Build Phases/Compile resources」に手動で追加する必要がありました。

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

5

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

4
pfuri

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

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

 NSString *path=@"ModelName";

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

model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
4
Chris So

ここですべてのソリューションを試しましたが、どれも機能しませんでした。プロジェクトの名前を変更すると、問題が発生しました。どうやら、Xcodeはコンパイル中に間違った場所で古いmomdファイルを探し続けているようです。

上記のすべての解決策を試してみたが成功しなかった場合は、.xcdatamodeldファイル。それは私のために働いたものです。

4
XCool

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

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

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

4
fredrik

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

1
nomann

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

生成されたmomdフォルダーには、momファイルが含まれています。シミュレーターのアプリは両方を見ることができましたが、sqliteファイルの生成に失敗しました。

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

1

これであなたの問題が解決しないことはわかっていますが、昨日この問題に何時間も悩まされました。@ Dominic Williamsが投稿したソリューションは、ArrayIndexOutOfBoundsException(Objective-Cに相当するもの)を提供してくれました。

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

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

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

私は何時間も答えを探していましたが、何もうまくいきませんでした。しかし、その後、私は突然これを見つけました 記事 。したがって、これによると、問題は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
kokoko

私は同じ問題、すなわち.

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

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

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

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

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

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

1
Brian Gerfort

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

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

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

0
stackr

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

これが誰にも役立つかどうかはわかりません。

0
Troy

このスレッドも参照してください: 単体テストではコアデータモデルファイルが見つかりません

ユニットテストでのみ発生した問題の解決に役立ちました

0

私にとって問題は、モデルをサンドボックスプロジェクトから実際のプロジェクトにコピーしたためです。モデルが使用されているプロジェクト内からモデルを生成することを常に確認してください。

0
FujiRoyale

私もこの問題に直面していますが、ModelName.xcdatamodeld作業中のファイル。だから私はModelName.xcdatamodeldファイルが適切に追加されていないため、アプリを一度確認してクリーンアップし、実行してください。

0

I 名前を変更.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でこれを使用しています

私はそれが役立つことを願っています!

0
NeverHopeless

ネーミングの問題を修正した後、エラーが残りました。その後、Xcode 5を再起動した後に機能しました。これにより、ここで提供されている手動リンクの提案のいくつかと同じことが自動的に行われる可能性があります。

0
EthanP

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

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

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

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

0
kubilay