2013-07-12 9 views
7

In meiner Anwendung kann ich alle Daten aus der Datenbank löschen. Sobald diese Operation abgeschlossen ist, wird ein gebündeltes JSON analysiert und dann in der Datenbank gespeichert (um die Datenbank in den Standardzustand zurückzuversetzen). Die Operation zum Analysieren und Speichern dieses JSON funktioniert in jedem Fall gut, außer nach dem Löschen und Wiederherstellen des persistenten Speichers. In diesem Fall bekomme ich 'NSInvalidArgumentException', Grund: 'Der persistente Speicher des Objekts ist von diesem NSManagedObjectContext-Koordinator nicht erreichbar'. Diese Ausnahme wird ausgelöst, wenn Sie nach dem Speichern in einem Hintergrundkontext versuchen, mergeChangesFromContextDidSaveNotification für meinen Hauptthreadkontext aufzurufen.Kerndatenfehler nach dem Wiederherstellen des persistenten Speichers

Die Neuerstellung des Speichers wird im Hauptthread durchgeführt, wobei das Parsen und Speichern immer in einem Hintergrundthread stattfindet. Hier ist der Getter für meinen verwalteten Objektkontext Thread-Sicherheit zu gewährleisten:

- (NSManagedObjectContext *)managedObjectContext { 

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

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

    return threadContext; 
} 

die newManagedObjectContext Methode Objekt all neuen Instanzen des gleichen NSPersistentStoreCoordinator gibt.

Hier ist der Code verwendet, um den Speicher zu löschen (immer auf Hauptthread ausgeführt):

[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]; 

Das seltsame daran ist, dass diese denselben Code in anderen Projekten funktioniert gut, und es gibt keine Unterschiede außer der Inhalt der Daten. Jede Hilfe wird sehr geschätzt!

Antwort

13

Die

Diese Meldung bedeutet, dass Sie ein verwaltetes Objekt zu verwenden versucht, die aus dem Datenspeicher geladen wurde, die Sie gerade entfernt „persistenten Speicher für das Objekt dieses NSManagedObjectContext Koordinator nicht erreichbar ist“. Sie haben den permanenten Speicher aus dem Koordinator entfernt und die Speicherdatei gelöscht, aber Sie haben immer noch mindestens einen, den Sie aus diesem Speicher geladen haben. Sie können diese Objekte nicht mehr verwenden, da Sie diese spezifische Ausnahme erhalten. Stellen Sie sicher, dass Sie alle vorhandenen verwalteten Objekte vor loswerden, die auf dem Core Data-Stack in Ihrem zweiten Snippet nuklear sind.

Warum dies in einer anderen App funktioniert, ist höchstwahrscheinlich, dass App nicht veraltete verwaltete Objekte festhält.

+0

tatsächlich haben Sie Recht. Der Unterschied zwischen diesem Projekt und meinen anderen besteht darin, dass in dieser App der Stammansicht-Controller einen abgerufenen Ergebniscontroller verwaltet, der immer noch Objekte enthält, wenn der Speicher entfernt wird. Löschen und erneutes Laden dieses Controllers, nachdem der Speicher gelöscht wurde und jetzt funktioniert es großartig. tausend Dank! –

+0

Andere Möglichkeit, diesen Fehler zu bekommen, wenn ein temporaryContext - welcher Elternteil der absturzende Kontext ist - mit einer Fetch-Anfrage, Einstellwerten usw. abläuft und am Ende möchte temporaryContext Änderungen am Eltern speichern. –

Verwandte Themen