Dans mon application, j'ai parfois besoin de reconstruire et repeupler le fichier de base de données. La base de données SQLite est créée et gérée par la pile CoreData. Ce que j'essaie de faire est de supprimer le fichier et de recréer simplement l'objet persistentStoreCoordinator.Comment forcer Coredata à reconstruire le modèle de base de données sqlite?
Il fonctionne sous simulateur mais pas sur l'appareil, où je reçois une telle erreur:
NSFilePath = "/var/mobile/Applications/936C6CC7-423A-46F4-ADC0-7184EAB0CADD/Documents/MYDB.sqlite";
NSUnderlyingException = I/O error for database at /var/mobile/Applications/936C6CC7-423A-46F4-ADC0-7184EAB0CADD/Documents/MYDB.sqlite. SQLite error code:1, 'table ZXXXX already exists';
Je ne peux pas trouver la cause de ce en aucune façon. Il indique deux problèmes différents - L'erreur Cocoa 256 indique que le fichier n'existe pas ou n'est pas lisible. Mais le fichier IS est créé après la création de persistenStoreCoordinator, bien qu'il soit vide, mais après l'exécution de certaines requêtes, il disparaît.
Deuxième message indiquant tentative de créer alredy table existante est assez étrange dans ce cas.
Je suis assez confus et je n'arrive pas à comprendre ce qui se passe ici. Mon code ressemble à ceci:
NSString *path = [[WLLocalService dataStorePath] relativePath];
NSError *error = nil;
WLLOG(@"About to remove file %@", path);
[[NSFileManager defaultManager] removeItemAtPath: path error: &error];
if (error != nil) {
WLLOG(@"Error removing the DB: %@", error);
}
[self persistentStoreCoordinator];
WLLOG(@"Rebuild DB result %d", [[NSFileManager defaultManager] fileExistsAtPath: path]);
Après l'exécution de ce code, le fichier DB existe mais est vide. Lorsque la première requête (et toutes les suivantes) est exécutée, cela me donne l'erreur ci-dessus et le fichier disparaît.
Est-ce que quelqu'un a une idée de ce qui ne va pas?
Un grand merci de m'avoir indiqué la bonne façon!
Merci pour un conseil, c'est intéressant et je vais l'essayer.Mais n'est-ce pas la même chose lorsque toutes les instances de NSPersistentStoreCoordinator sont publiées juste avant la suppression du fichier? C'est ce qui arrive juste avant d'appeler ma méthode ci-dessus. Je suppose qu'il supprimera et libérera toutes les structures de données suivantes. Pouvez-vous expliquer pourquoi il est important de supprimer explicitement le magasin persistant du coordinateur avant de supprimer le fichier lui-même? – Burt
J'ai donc essayé votre solution et cela fonctionne! Un grand merci pour ça! Cependant je me demande toujours où est la différence entre supprimer explicitement le magasin persistant et simplement libérer le coordinateur. – Burt
Si vous définissez 'NSPersistentStoreCoordinator' à nil dans le cadre de 'NSManagedObjectContext' et le libérez, alors vous obtiendrez probablement la même chose, mais c'est beaucoup plus lourd que d'indiquer à' NSPersistentStoreCoordinator' de supprimer le magasin. –