2011-04-23 15 views
6

Potrzebuję usunąć mój magazyn trwały (wykonanie obiektu według obiektu jest niepraktyczne, ponieważ mam ponad 100 000 obiektów). Próbowałem to:Jak usunąć główny magazyn danych trwałych

- (IBAction)resetDatabase:(id)sender { 

    NSPersistentStore* store = [[__persistentStoreCoordinator persistentStores] lastObject]; 

    NSError *error = nil; 
    NSURL *storeURL = store.URL; 

    // release context and model 
    [__managedObjectContext release]; 
    [__managedObjectModel release]; 
    __managedObjectModel = nil; 
    __managedObjectContext = nil; 

    [__persistentStoreCoordinator removePersistentStore:store error:nil]; 

    [__persistentStoreCoordinator release]; 
    __persistentStoreCoordinator = nil; 

    [[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error]; 
    if (error) { 
     NSLog(@"filemanager error %@", error); 
    }  

    // recreate the stack 
    __managedObjectContext = [self managedObjectContext]; 

} 

Ale ten błąd, gdy próbuję wstawić podmioty do sklepu potem:

This NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation. 

Aktualizacja: Próbowałem zwolnieniu MOC i mama przed wyjęciem magazyn trwały, ale nadal mam ten sam błąd.

Odpowiedz

9

Oto jak zrobić funkcję „reset danych” w kilku aplikacjach:

- (void)reset { 
    // Release CoreData chain 
    [_managedObjectContext release]; 
    _managedObjectContext = nil; 
    [_managedObjectModel release]; 
    _managedObjectModel = nil; 
    [_persistentStoreCoordinator release]; 
    _persistentStoreCoordinator = nil; 

    // Delete the sqlite file 
    NSError *error = nil; 
    if ([fileManager fileExistsAtPath:_storeURL.path]) 
    [fileManager removeItemAtURL:_storeURL error:&error]; 
    // handle error... 
} 

Zasadniczo po prostu zwolnij łańcuch CoreData, a następnie usuń plik persistentStore. To właśnie próbujesz zrobić, nie używając removePersistentStore, co mnie nie obchodzi, ponieważ później przebuduję później koordynator persistentStore. Następnie przy następnym kluczowym wywołaniu danych łańcuch jest przebudowywany w sposób przezroczysty za pomocą konstruktów w stylu singleton-leniwym, takich jak:

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

Wow, myślę, że problemem był "removePersistentStore". Bez tej linii zadziałało ... Jestem ciekawy, dlaczego. – David

+1

Mam wrażenie, że samo usunięcie pliku .sqlite pozostawi wiele śmieci podczas używania podstawowych atrybutów danych, które zezwalają na "Zezwalanie na pamięć zewnętrzną". – magma

+0

Magma ma rację, jeśli użyjesz iCloud jest używany itp. Problemy będą miały miejsce. –

2

Możesz to zrobić zewnętrznie, ponieważ musisz to zrobić tylko podczas tworzenia aplikacji. Mam otwarty terminal, w którym ręcznie usuwam magazyn przed ponownym uruchomieniem aplikacji. Wszystko, co musisz wiedzieć, to gdzie się znajduje. Loguję go do konsoli za każdym razem, gdy moja aplikacja działa z następującym kodem:

[[CoreDataSingleton sharedManager] managedObjectContext]; //be sure to create the store first! 

//Find targeted mom file in the Resources directory 
NSString *momPath = [[NSBundle mainBundle] pathForResource:@"Parking" ofType:@"mom"]; 
NSLog(@"momd path: %@",momPath); 

Mam nadzieję, że pomoże!

2

Należy upewnić się, że wszelkie konteksty obiektów zarządzanych dołączone do magazynu trwałego zostały zwolnione przed próbą usunięcia magazynu. W przeciwnym razie kontekst wywoła ten błąd.

+0

Próbowałem tego bezskutecznie (patrz zaktualizowany kod). – David

Powiązane problemy