2013-07-12 17 views
7

私のアプリケーションでは、データベースからすべてのデータをクリアする機能があります。この操作が完了すると、バンドルされたJSONが解析され、データベースに保存されます(データベースをデフォルト状態に戻すため)。このJSONを解析して保存する操作は、永続ストアをクリアして再作成した後を除いて、正常に動作します。この場合、「NSInvalidArgumentException」が表示されます。理由:「オブジェクトの永続ストアがこのNSManagedObjectContextのコーディネータから到達できません。この例外は、バックグラウンドコンテキストで保存した後、メインスレッドコンテキストでmergeChangesFromContextDidSaveNotificationを呼び出そうとしたときにスローされます。永続ストアを再作成した後のコアデータエラー

ストアの再作成はメインスレッドで実行されます。メインスレッドでは、バックグラウンドスレッドで常に解析と保存が行われます。ここに私の管理対象オブジェクトコンテキストはスレッド安全性を確保するためのゲッターは次のとおりです。

- (NSManagedObjectContext *)managedObjectContext { 

    NSMutableDictionary *threadDictionary = [[NSThread currentThread] threadDictionary]; 
    NSManagedObjectContext *threadContext = threadDictionary[ckCoreDataThreadKey]; 

    if (!threadContext) { 
     threadContext = [self newManagedObjectContext]; 
     threadDictionary[ckCoreDataThreadKey] = threadContext; 
    } 

    return threadContext; 
} 

newManagedObjectContext方法は、すべての新しいインスタンスを同じNSPersistentStoreCoordinatorオブジェクトを提供します。ここで

は(常にメインスレッドで実行)ストアをクリアするために使用するコードです:

[self.managedObjectContext lock]; 
[self.managedObjectContext reset]; //to drop pending changes 
             //delete the store from the current managedObjectContext 
if ([[self.managedObjectContext persistentStoreCoordinator] removePersistentStore:[[[self.managedObjectContext persistentStoreCoordinator] persistentStores] lastObject] error:error]) { 
    [[NSFileManager defaultManager] removeItemAtURL:storeURL error:error]; 

    [[self.managedObjectContext persistentStoreCoordinator] addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:error]; //recreates the persistent store 

    [self addSkipBackupAttributeToItemAtURL:storeURL]; 
} 

[self.managedObjectContext unlock]; 

奇妙な部分は、この同じコードは、他のプロジェクトでは正常に動作し、かつ以外の差がないということですデータの内容。どんな助けでも大歓迎です!

答えて

13

「オブジェクトの永続ストアがこのNSManagedObjectContextのコーディネーターから到達可能ではありません」

このメッセージは、あなただけの削除データストアからロードされた管理対象オブジェクトを使用しようとしたことを意味します。コーディネーターから永続ストアを削除してストアファイルを削除しましたが、そのストアからロードした少なくとも1つのNSManagedObjectがまだあります。これらのオブジェクトを使用することはできません。なぜなら、このような例外が発生するからです。 の既存の管理対象オブジェクトを取り除いてから、が2番目のスニペットのコアデータスタックに原子炉を通過するようにしてください。

このアプリが別のアプリで動作する理由は、アプリが古い管理対象オブジェクトを保持していない可能性が高いからです。

+0

本当に、あなたは正しいです。このプロジェクトと私の違いは、このアプリケーションでは、ルートビューコントローラは、ストアが削除されたときにオブジェクトを保持している取得結果コントローラを管理するということです。ストアをクリアした後にそのコントローラを削除して再ロードして、今すぐ使えます。感謝万円! –

+0

temporaryContext(親がクラッシュするコンテキスト)がフェッチ要求、値の設定などで進行中で、temporaryContextの最後に変更を親に保存したい場合は、このエラーが発生する可能性があります。 –

関連する問題