Ich versuch jetzt schon ein paar Tage, einen funktionierenden Mechanismus zu implementieren, der mir meine komplette Core Data Datenkbank leert (quasi ein Reset-Button in den Einstellungen meiner App). Leider bekomm ichs nicht hin, und die App fliegt mir um die Ohren wenn ich nach dem Löschen versuche weiterzuarbeiten. Über google bin ich auf verschiedene Lösunsansätze gestoßen, keiner davon ging wirklich.
Fakten:
In meiner AppDelegate-Klasse habe ich:
- NSManagedObjectModel *managedObjectModel;
- NSManagedObjectContext *managedObjectContext;
- NSPersistentStoreCoordinator *persistentStoreCoordinator;
Den managedObjectContext gebe ich an meinen RootViewController weiter; von dort aus wird er an 3 Sub-Views weitergegeben (alle per Property & retain flag).
Diese Methoden habe ich aus den Beispielen (errorhandling weggelassen):
Alles anzeigen
So, nun mein letzter Versuch, die komplette Datenbank zu löschen:
Alles anzeigen
Ergebnis:
Daten werden komplett gelöscht, ich kann wieder zu meinem RootViewController wechseln, eine leere Tabelle wird mir angezeigt. Ich kann auch ein paar mal neue Daten Eintragen, und die Datenbank erneut löschen. Wenn ich dann wieder was eintragen will, crasht es (vermutlich ist es Zufall, wanns crasht):
Alles anzeigen
Ich habe auch schon versucht, sowohl den PersistenStoreCoordinator als auch den ManagedObjectContext zu löschen, neu zu erzeugen und an alle SubViewController durchzureichen. Das Ergebnis ist das gleiche. Erst läufts, dann nach ein paar Clicks fliegts mir um die Ohren.
Was mach ich falsch, und wie mach ichs richtig?
Fakten:
In meiner AppDelegate-Klasse habe ich:
- NSManagedObjectModel *managedObjectModel;
- NSManagedObjectContext *managedObjectContext;
- NSPersistentStoreCoordinator *persistentStoreCoordinator;
Den managedObjectContext gebe ich an meinen RootViewController weiter; von dort aus wird er an 3 Sub-Views weitergegeben (alle per Property & retain flag).
Diese Methoden habe ich aus den Beispielen (errorhandling weggelassen):
Quellcode
- - (NSManagedObjectContext *) managedObjectContext {
- if (managedObjectContext)
- return managedObjectContext;
- NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
- if (coordinator) {
- managedObjectContext = [[NSManagedObjectContext alloc] init];
- [managedObjectContext setPersistentStoreCoordinator: coordinator];
- }
- return managedObjectContext;
- }
- - (NSManagedObjectModel *)managedObjectModel {
- if (managedObjectModel)
- return managedObjectModel;
- managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
- return managedObjectModel;
- }
- - (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
- if (persistentStoreCoordinator)
- return persistentStoreCoordinator;
- NSURL* storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"CoreData.sqlite"]];
- persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
- [persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error];
- return persistentStoreCoordinator;
- }
So, nun mein letzter Versuch, die komplette Datenbank zu löschen:
Quellcode
- - (void) wipeData {
- NSArray *stores = [persistentStoreCoordinator persistentStores];
- for(NSPersistentStore *store in stores) {
- [persistentStoreCoordinator removePersistentStore:store error:nil];
- [[NSFileManager defaultManager] removeItemAtPath:store.URL.path error:nil];
- }
- [persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:store.URL options:nil error:&error];
- return;
Ergebnis:
Daten werden komplett gelöscht, ich kann wieder zu meinem RootViewController wechseln, eine leere Tabelle wird mir angezeigt. Ich kann auch ein paar mal neue Daten Eintragen, und die Datenbank erneut löschen. Wenn ich dann wieder was eintragen will, crasht es (vermutlich ist es Zufall, wanns crasht):
Quellcode
- 2011-02-24 20:07:03.912 MyApp[1657:207] Serious application error. Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. The NSManagedObject with ID:0x886d000 has been invalidated. with userInfo (null)
- Detected an attempt to call a symbol in system libraries that is not present on the iPhone:
- _Unwind_Resume called from function -[NSManagedObjectContext(_NSInternalChangeProcessing) _processRecentChanges:] in image CoreData.
- 2011-02-24 20:07:03.914 Annual leave[1657:207] *** Terminating app due to uncaught exception 'NSObjectInaccessibleException', reason: 'The NSManagedObject with ID:0x886d000 has been invalidated.'
- *** Call stack at first throw:
- (
- (gdb) bt
- #0 0x93a74176 in __kill ()
- #1 0x93a74168 in kill$UNIX2003 ()
- #2 0x93b0689d in raise ()
- #3 0x93b1c9bc in abort ()
- #4 0x93f2afda in __gnu_cxx::__verbose_terminate_handler ()
- #5 0x02954333 in _objc_terminate ()
- #6 0x93f2917a in __cxxabiv1::__terminate ()
- #7 0x93f291ba in std::terminate ()
- #8 0x93f292b8 in __cxa_throw ()
- #9 0x02954481 in objc_exception_throw ()
- #10 0x02415277 in -[NSManagedObjectContext save:] ()
- #11 0x000132d5 in -[MySubViewController saveRecord] (self=0x8830320, _cmd=0x2e780) at /Volumes/Source/App/.../MySubViewController.m:663
- #12 0x003107f8 in -[UIApplication sendAction:to:from:forEvent:] ()
- #13 0x0051c68b in -[UIBarButtonItem(UIInternal) _sendAction:withEvent:] ()
- #14 0x003107f8 in -[UIApplication sendAction:to:from:forEvent:] ()
- #15 0x0039bde0 in -[UIControl sendAction:to:forEvent:] ()
- #16 0x0039e262 in -[UIControl(Internal) _sendActionsForEvents:withEvent:] ()
- #17 0x0039ce0f in -[UIControl touchesEnded:withEvent:] ()
- #18 0x003343d0 in -[UIWindow _sendTouchesForEvent:] ()
- #19 0x00315cb4 in -[UIApplication sendEvent:] ()
- #20 0x0031a9bf in _UIApplicationHandleEvent ()
Ich habe auch schon versucht, sowohl den PersistenStoreCoordinator als auch den ManagedObjectContext zu löschen, neu zu erzeugen und an alle SubViewController durchzureichen. Das Ergebnis ist das gleiche. Erst läufts, dann nach ein paar Clicks fliegts mir um die Ohren.
Was mach ich falsch, und wie mach ichs richtig?
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von s710 ()