2011-04-23 16 views
6

Necesito eliminar mi tienda persistente (hacerlo objeto por objeto no es práctico porque tengo más de 100.000 objetos). He intentado esto:Cómo eliminar una tienda persistente de datos centrales

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

} 

Pero consigo este error cuando intento insertar entidades en la tienda después:

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

Actualización: He intentado liberar el MOC y MOM antes de retirar la tienda persistente, pero sigo teniendo el mismo error.

Respuesta

9

Aquí es cómo hacer una función "reset de datos" en varias aplicaciones:

- (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... 
} 

Básicamente acabo de soltar la cadena CoreData, a continuación, elimine el archivo PersistentStore. Eso es lo que intentas hacer, sin usar removePersistentStore, que no me importa, ya que voy a reconstruir el coordinador persistentStore más adelante. Luego, en la próxima llamada de datos centrales, la cadena se reconstruye de forma transparente utilizando constructores de estilo de latencia simple como:

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

Wow, creo que el problema fue 'removePersistentStore'. Sin esa línea funcionó ... Tengo curiosidad de por qué sin embargo. – David

+1

Tengo la sensación de que simplemente eliminar el archivo .sqlite dejará una gran cantidad de basura al usar atributos de datos centrales que "Permiten almacenamiento externo". – magma

+0

magma tiene razón, si utiliza iCloud se utiliza, etc., los problemas sucederán. –

2

Puede hacerlo externamente ya que solo necesita hacer esto mientras desarrolla su aplicación. Tengo un terminal abierto en el que elimino la tienda manualmente antes de volver a ejecutar mi aplicación. Todo lo que necesita saber es dónde está ubicado. Lo registro en la consola cada vez que mi aplicación se ejecuta con el siguiente código:

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

Espero que ayude!

2

Debe asegurarse de que cualquier contexto de objeto administrado asociado a la tienda persistente se haya liberado antes de intentar eliminar la tienda. De lo contrario, el contexto evocará ese error.

+0

Intenté eso en vano (ver código actualizado). – David

Cuestiones relacionadas