Soy bastante nuevo para CoreData y esta aplicación que lo utiliza.
Y actualmente estoy trabajando en una función que borra todo los datos de los núcleos cuando me registro en la aplicación.

Tengo 2 sqllite archivos (por alguna razón, se pensó que fue a la mano)

¿Cómo puedo borrar los archivos de todos los datos y restaurarlos en un dataless estado?

Yo he probado un montón de maneras de acuerdo a las guías, ASÍ que.

Cómo borrar/restablecer todos los CoreData en uno a muchos relación

cómo quitar todos los objetos de Datos Básicos

Todos ellos parecen fallar para mí.
Ahora me pregunto, ¿qué hago mal? Y tal vez alguien me puede explicar cómo restablecer mi 2 CoreData archivos de la manera adecuada.

EDICIÓN:

//should clear the whole coredata database. mainly used for logout mechanism
-(void)resetCoreData
{
    for (NSPersistentStore *store in self.persistentStoreCoordinator.persistentStores)
    {
//   NSPersistentStore *store = self.persistentStoreCoordinator.persistentStores[0];
        NSError *error;
        NSURL *storeURL = store.URL;
        DLog(@"storeURL: %@", storeURL);
        NSPersistentStoreCoordinator *storeCoordinator = self.persistentStoreCoordinator;
        [storeCoordinator removePersistentStore:store error:&error];
        [[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error];

        DLog(@"There are erreurs: %@", error);
//   [self addDefaultData];
    }

    _persistentStoreCoordinator = nil;
    _managedObjectContext = nil;
    _managedObjectModel = nil;
}

Esto no parece claro el CoreData para mí.

EDIT2:

- (NSManagedObjectContext *)managedObjectContext
{
    if (_managedObjectContext != nil) {
        return _managedObjectContext;
    }
    
    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
        _managedObjectContext = [[NSManagedObjectContext alloc] init];
        [_managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    return _managedObjectContext;
}
- (NSManagedObjectModel *)managedObjectModel
{
if (__managedObjectModel != nil) {
return __managedObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"MyName" withExtension:@"momd"];
__managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return __managedObjectModel;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (__persistentStoreCoordinator != nil) {
return __persistentStoreCoordinator;
}
NSString *storePath = [[self applicationDocumentsDirectory]
stringByAppendingPathComponent:@"MyName.sqlite"];
NSFileManager *fileManager = [NSFileManager defaultManager];
//If the expected store doesn't exist, copy the default store.
if (![fileManager fileExistsAtPath:storePath]) {
NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"MyName" ofType:@"momd"];
if (defaultStorePath) {
[fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
}
}
__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
//Check to see what version of the current model we're in. If it's >= 2.0,
//then and ONLY then check if migration has been performed...
NSSet *versionIdentifiers = [[self managedObjectModel] versionIdentifiers];
DLog(@"Which Current Version is our .xcdatamodeld file set to? %@", versionIdentifiers);
if ([versionIdentifiers containsObject:@"2.0"])
{
BOOL hasMigrated = YES;
if (hasMigrated==YES) {
storePath = nil;
storePath = [[self applicationDocumentsDirectory]
stringByAppendingPathComponent:@"MyName2.sqlite"];
}
}
NSURL *storeUrl = [NSURL fileURLWithPath:storePath];
NSError *error;
NSDictionary *pscOptions = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:NO], NSInferMappingModelAutomaticallyOption,
nil];
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:storeUrl
options:pscOptions
error:&error]) {
DLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return __persistentStoreCoordinator;
}

Edit 3:
Todavía estoy buscando una manera de restablecer mi CoreData como si he borrado la aplicación y comenzó de nuevo. La forma habitual de hacerlo no están trabajando para mi caso. Y hay 2 sqllite archivos. Hay indicios de una migración que tuvo lugar en algún punto de la aplicación, pero no estoy muy seguro de cuándo y cómo. Los registros de Error de mostrar nada útil.

Yo no estoy buscando la manera más eficiente. Sólo la forma.

Me ayude a salir y la recompensa es tuyo.

Editar 4:
RESULTADO FINAL:
Parecía que mi código de la herencia tuvo una segunda ManagedObjectContext instancias. En el momento que me lo recuperó y lo hizo al ras con la función. Ambos sqlite-archivos desaparecieron como era necesario.

Gracias a todos los que poner esfuerzo en mi problema.

Lo primero que puedo ver es que va a ajustar todo lo que coredata cosas a cero en el interior del bucle. Que debe ser no después de que el ciclo ha terminado de ejecutarse.
No funciona de ninguna forma. Lo que noto es que sólo una de las 2 tiendas que se está registrando. Lo que podría ser una razón para que el segundo no estar dentro del bucle?
Al configurar los datos principales cosas que debe tener solo una tienda de todos modos. Que una tienda contendrá todos los datos (a menos que usted está haciendo algo que requiere específicamente que a más de uno)?
Es todo el código de la herencia. Y es todo un lío. Y acabo de empezar a cavar en esta aplicación. Por alguna razón hay 2 CoreData SQLLite archivos y hay una sugerencia de una migración función de allí. Pero no veo una necesidad de 2 tiendas.
Ah veo. ¿Tienes el código que crea e inicializa el coredata pila? Yo tal vez tratar de descifrar lo que está pasando.

OriginalEl autor Totumus Maximus | 2013-02-06

4 Comentarios

  1. 38

    pruebe el siguiente método para vaciar la base de datos, funciona perfecto para mí.

    -(void) flushDatabase{
    [__managedObjectContext lock];
    NSArray *stores = [__persistentStoreCoordinator persistentStores];
    for(NSPersistentStore *store in stores) {
    [__persistentStoreCoordinator removePersistentStore:store error:nil];
    [[NSFileManager defaultManager] removeItemAtPath:store.URL.path error:nil];
    }
    [__managedObjectContext unlock];
    __managedObjectModel    = nil;
    __managedObjectContext  = nil;
    __persistentStoreCoordinator = nil;
    }
    Es prácticamente la misma que la de otras respuestas dadas. Por desgracia no trabajo para mí.
    hacer una cosa, aplicar un punto de ruptura en la flushdatabase método, y vaya a su «/Library/Application\ Support/iPhone\ Simulador» y abra la base de datos con SQLITEMANAGER o LITA y ver las entradas de base de datos, y cuando la descarga de la base de datos se ejecuta el método de actualización de la base de datos, usted verá que su base de datos está vacía completamente. por favor me actualice al hacer esta depuración.
    Estoy haciendo esto depuración de ahora. Tengo 2 archivos sqlite. Uno está casi vacío «db2.sqlite». El otro tiene los datos que parece muy familiar para mí a partir de la aplicación de la base de datos.sqlite». Ninguno de ellos obtiene sus datos borrados después de que el método flush.
    Dudo que usted no tiene el derecho managedobjectcontext con usted, u cuando llame a la flushdatabase método.
    saludos !!! la depuración de las reglas 🙂

    OriginalEl autor yunas

  2. 2
    NSPersistentStoreCoordinator *storeCoordinator = self.persistentStoreCoordinator;
    [storeCoordinator removePersistentStore:store error:&error];
    [[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error];

    Así que usted está eliminando el almacén persistente desde el almacén persistente de coordinador y, a continuación, tratando de borrar el archivo. Pero sólo la eliminación de la tienda por parte de la coordinadora no es suficiente para garantizar que el archivo asociado con la tienda ha sido cerrado, y si no lo tiene entonces el sistema de archivos probablemente le impiden eliminar el archivo. Yo no puedo decir de tu pregunta si está utilizando ARC aquí, pero ya que dicen que es viejo código hay una buena probabilidad de que usted no lo es. De cualquier manera, si la eliminación de la tienda de las causas que se autoreleased en lugar de libertad, o si mantiene otras referencias a la tienda en cualquier lugar, a continuación, la tienda no se desasignan sólo porque lo haya quitado el coordinador, el archivo puede permanecer abierta, y eliminar el archivo va a fracasar.

    Una buena manera de ver lo que realmente está pasando, además de buscar en el objeto de error proporcionados por -removeItemAtPath:error:, es echar un vistazo en el sistema de archivos y ver si el archivo sigue ahí después de intentar eliminarlo. Ir a el Organizador de la ventana, seleccione su dispositivo y la aplicación, y descargar una copia de la aplicación del sandbox. A continuación, usted debe ser capaz de ver si el archivo está siendo eliminado.

    Si usted ve que los archivos que se eliminan como usted piensa que debería ser, a continuación, busque otras maneras en que los datos pueden ser restaurados. Si el Usuario cierra la sesión y, a continuación, UserB inicia sesión en la aplicación mientras se está ejecutando, ¿estás seguro de que has comenzado con un nuevo objeto administrado contexto? Es posible que el Usuario de que los datos permanecen en el MOC? A continuación, podría ser por escrito al crear y agregar una nueva tienda. Otra posibilidad que se me ocurre es que iCloud es «ayudar» aquí. Veo que los archivos de datos se guardan en el directorio de Documentos, y iOS normalmente tratamos de mantener los archivos en ese directorio de la copia de seguridad de iCloud. Tal vez cuando se crea un nuevo almacén de datos del usuario b, iCloud, añade del Usuario registros de vuelta a la tienda. (Parece improbable-estoy bastante seguro de que iCloud es más sofisticado que eso … pero algo a comprobar.)

    Ok déjame aclarar las cosas un poco. 1. El ARCO se utiliza en la aplicación, funciones de liberación y el grupo de liberación automática de las funciones no se utilizan nunca. Cuando me «logout» yo no soy la detección de cualquier cambio en el sistema de archivos de cualquier tipo. iCloud no está involucrado. El MOC es una buena oportunidad tho. No estoy seguro de la forma en que se gestionan dentro de la aplicación. Puede usted decirme cómo debo manejar?

    OriginalEl autor Caleb

  3. 1

    Puedo usar esta función en el AppDelegate de una de mis aplicaciones…

    - (void)deleteAllCoreData
    {
    NSPersistentStore *store = self.persistentStoreCoordinator.persistentStores[0];
    NSError *error;
    NSURL *storeURL = store.URL;
    NSPersistentStoreCoordinator *storeCoordinator = self.persistentStoreCoordinator;
    [storeCoordinator removePersistentStore:store error:&error];
    [[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error];
    __persistentStoreCoordinator = nil;
    __managedObjectContext = nil;
    __managedObjectModel = nil;
    [self addDefaultData];
    }

    Elimina el almacén persistente de que CoreData los usos y las hojas de manera que uno nuevo se configura cuando núcleo de acceder a los datos de nuevo.

    Este es el método que se describe en el segundo enlace que has facilitado.

    Sí, bueno, casi. El problema sin embargo es que no está funcionando para mí.
    Lo que no está funcionando? ¿Qué errores estás recibiendo? ¿Cómo sabe que no está funcionando.
    No tengo errores de ningún tipo. Pero me doy cuenta que cuando hago cerrar la sesión y volver a iniciar sesión con otra cuenta de que todos los datos almacenados en la CoreData de la cuenta anterior todavía está allí y visible.
    Se va a añadir los datos de nuevo cuando se inicia la aplicación?
    Sin ver el código no te puedo ayudar más. El código que he publicado obras como lo estoy utilizando para hacer exactamente esto. Si algo en su código no está configurada la derecha, a continuación, puede causar un problema.

    OriginalEl autor Fogmeister

  4. 1

    Si su aplicación puede crear los archivos, a continuación, simplemente eliminarlos cuando la aplicación se cierra.
    Si usted tiene alguna noción de una base de datos que cuenta con una valiosa información de esquema, y sólo tiene que truncar el archivo, que no es realmente el caso en el núcleo central de datos… El esquema es en el compilado de la entidad modelos y xcwhatever archivos.

    También tengo que acabo de leer es malo, porque si quieres datos básicos a ser persistente y, a continuación, utiliza la herramienta equivocada.

    No estoy de acuerdo con su última declaración. Datos básicos tiene mucho más ventajas que la persistencia. Es normal tener parte del modelo persistente y otra parte transitoria utilizando NSInMemoryStoreType. Es por eso que está ahí, ¿verdad?
    Ofc quiero que mis datos sean persistentes. Sólo quiero aclarar todo al iniciar la sesión con su cuenta. Que es un caso raro, pero no uno que yo debería ignorar. Un usuario se registra automáticamente después de registrarse o anotarse en algún momento. Y sólo se puede iniciar manualmente. Que es una conciencia acto del usuario para borrar los datos locales de ese usuario en particular. Así que tengo que estar preparado para un nuevo (o el mismo) usuario cuando se inicie de nuevo.
    a continuación, subir el .los datos de los archivos y eliminarlos, en el registro de descargar de nuevo…
    Supongo que se podría utilizar sin un persistente persistente de la tienda… para deshacer el de administración tal vez… Pero sin duda es menos convincente de casos de uso.
    No hay más que deshacer de gestión: relación inversa, KVO, control de versiones, … (en el futuro tal vez trabajando iCloud sync). Por lo general, tienen pocas entidades persistente, y el resto está en el almacén de la memoria. Tan sólo unos pocos clics para persistir en ellos (si decido así) sin necesidad de modificar nada.

    OriginalEl autor Grady Player

Dejar respuesta

Please enter your comment!
Please enter your name here