2017-10-12 11 views
0

Lorsque j'essaie de migrer mon ancienne base de données vers une nouvelle base de données, tout se passe correctement. Mais quand j'essaie d'accéder à la base de données, elle dit qu'elle est corrompue ou mal formée. Cela n'arrive que dans iOS11.La migration personnalisée corrompt db

Je reçois cette erreur -

error: exception handling request: <NSSQLRelationshipFaultRequestContext: 0x1c4cbc9e0> , Fatal error. The database at /var/mobile/Containers/Data/Application/743F0953-2F57-4B9F-931A-0E0AEF9E8D0A/Documents/Main.db is corrupted. SQLite error code:11, 'database disk image is malformed' with userInfo of { 
    NSFilePath = "/var/mobile/Containers/Data/Application/743F0953-2F57-4B9F-931A-0E0AEF9E8D0A/Documents/Main.db"; 
    NSSQLiteErrorDomain = 11; 
} 

Quand j'essayez d'accéder à db, je reçois -

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Object's persistent store is not reachable from this NSManagedObjectContext's coordinator' 

Ceci est mon code de migration -

NSError  *error = nil; 
    NSMappingModel     *mapping = [NSMappingModel inferredMappingModelForSourceModel: oldModel destinationModel: self error: &error]; 
    if (error) { 
     LOG(@"Error while inferring mapping model: %@", error); 
     return NO; 
    } 
    NSString      *newContextPath = [contextPath stringByAppendingPathExtension: @"tmp"]; 
    NSValue       *classValue = [[NSPersistentStoreCoordinator registeredStoreTypes] objectForKey: NSSQLiteStoreType]; 
    Class       sqliteStoreClass = (Class)[classValue pointerValue]; 
    Class       sqliteStoreMigrationManagerClass = [sqliteStoreClass migrationManagerClass]; 
    NSURL       *srcURL = [NSURL fileURLWithPath: contextPath], *dstURL = [NSURL fileURLWithPath: newContextPath]; 
    NSMigrationManager    *manager = [[sqliteStoreMigrationManagerClass alloc] initWithSourceModel: oldModel destinationModel: self]; 

    @try { 
     if (![manager migrateStoreFromURL: srcURL type:NSSQLiteStoreType options:nil withMappingModel:mapping toDestinationURL: dstURL destinationType:NSSQLiteStoreType destinationOptions:nil error:&error]) { 
      LOG(@"Migration failed %@", error); 
      return NO; 
     } 
    } @catch (NSException *exception) { 
     LOG(@"Exception: %@", exception); 
     return NO; 
    } 
    if (![[NSFileManager defaultManager] removeItemAtPath: contextPath error: &error]) { 
     LOG(@"Error removing old database: %@", error); 
     return NO; 
    } 

    if (![[NSFileManager defaultManager] moveItemAtPath: newContextPath toPath: contextPath error: &error]) { 
     LOG(@"Error renaming/moving new database: %@", error); 
     return NO; 
    } 
     LOG(@"- Context Migration: Complete"); 

Répondre

0

J'ai finalement découvert , Je supprimais seulement le fichier .db mais pas les fichiers .shm et .wal. C'était correct avec iOS10 et ci-dessous, mais corrompt en quelque sorte la DB dans iOS11. Ainsi, supprimé les anciens fichiers .shm et .wal ont résolu le problème.

Si quelqu'un se débat dans ce qui ne va pas, cela peut être utile.