2012-04-18 9 views
6

Ho un (proably) semplice da risolvere problema con il mio archivio persistente coredata.rinominare persistentstore coordinator URL

ho creato con:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator 
{ 

    if (persistentStoreCoordinator != nil) 
    { 
     return persistentStoreCoordinator; 
    } 

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"dummyURL.sqlite"]; 

    NSError *error = nil; 
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) 
    { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 

    return persistentStoreCoordinator; 
} 

utilizzando l'URL dummyURL.sqlite

ho fatto questo, il primo giorno di lavoro con il progetto, e hanno dimenticato di rinominarlo .. ora tutti i miei dispositivi di test attuali (4) erano in uso per più di due mesi, utilizzando l'applicazione, raccogliendo un sacco di dati e la memorizzazione con un URL stupida ^^

UPDATE Ho fatto qualche ricerca sulla migrazione di negozi persistenti e ha scritto questa funzione:

-(void)migrate{ 

    NSPersistentStoreCoordinator *psc = [self.dataHandler.managedObjectContext persistentStoreCoordinator]; 
    NSURL *oldURL = [psc URLForPersistentStore:[[psc persistentStores]objectAtIndex:0]]; 

    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 

    NSURL *newURL = [[appDelegate applicationDocumentsDirectory] URLByAppendingPathComponent:@"database.sqlite"]; 

    NSError *error = nil; 

    NSPersistentStore *oldStore = [psc persistentStoreForURL:oldURL]; 
    NSPersistentStore *newStore = [psc migratePersistentStore:sqliStoreOld 
                  toURL:newURL 
                 options:nil 
                 withType:NSSQLiteStoreType 
                 error:&error]; 

} 

DOMANDA 1will this work or will i lose some data with that?

DOMANDA 2afterwards will i just have to change the appendString in my persistenstore function?

risposta

3

sono riuscito a risolvere da solo usando la funzione migratePersistentStore:

-(void)migrate{ 

    NSPersistentStoreCoordinator *psc = [self.dataHandler.managedObjectContext persistentStoreCoordinator]; 
    NSURL *oldURL = [psc URLForPersistentStore:[[psc persistentStores]objectAtIndex:0]]; 

    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 

    NSURL *newURL = [[appDelegate applicationDocumentsDirectory] URLByAppendingPathComponent:@"database.sqlite"]; 

    NSError *error = nil; 

    NSPersistentStore *oldStore = [psc persistentStoreForURL:oldURL]; 
    NSPersistentStore *newStore = [psc migratePersistentStore:sqliStoreOld 
                  toURL:newURL 
                 options:nil 
                 withType:NSSQLiteStoreType 
                 error:&error]; 

} 

dopo Ho appena cambiato l'appendURL a database.sqli nel mio AppDelegate. funziona come un fascino :)

0

mi sento di raccomandare la creazione di un secondo negozio persistente con il nuovo URL e l'aggiunta di un pulsante da qualche parte che copia tutti i dati che hai nel nuovo. Assicurati di verificare che tutti i tuoi dati siano nel nuovo archivio persistente prima di rimuovere quello vecchio dall'app.

+0

grazie per la risposta rapida. Sono un po 'losco sul concetto persistentstore (thats perché non lo tocco più dopo averlo creato) ... im attualmente esplorando 'migratePersistentStore' ma ho paura di provarlo effettivamente a causa di dataloss ..:/ dove vorrei mettere un codice di migrazione? –