私のアプリケーションでは、データベースからすべてのデータをクリアする機能があります。この操作が完了すると、バンドルされた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];
奇妙な部分は、この同じコードは、他のプロジェクトでは正常に動作し、かつ以外の差がないということですデータの内容。どんな助けでも大歓迎です!
本当に、あなたは正しいです。このプロジェクトと私の違いは、このアプリケーションでは、ルートビューコントローラは、ストアが削除されたときにオブジェクトを保持している取得結果コントローラを管理するということです。ストアをクリアした後にそのコントローラを削除して再ロードして、今すぐ使えます。感謝万円! –
temporaryContext(親がクラッシュするコンテキスト)がフェッチ要求、値の設定などで進行中で、temporaryContextの最後に変更を親に保存したい場合は、このエラーが発生する可能性があります。 –