Nella mia app a volte ho bisogno di ricostruire e ripopolare il file di database. Il databse SQLite è creato e gestito dallo stack CoreData.Come forzare il coredata per ricostruire il modello di database sqlite?
Quello che sto cercando di fare è rilasciare il file e quindi semplicemente ricreare l'oggetto persistentStoreCoordinator.
Opera sotto simulatore, ma non sul dispositivo, dove sto ottenendo un errore del genere:
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';
non riesco a trovare la causa di questo in alcun modo. Indica due diversi problemi: l'errore 256 di Cocoa indica che il file non esiste o non è leggibile. Ma il file IS creato dopo aver creato persistenStoreCoordinator, anche se è vuoto, ma dopo aver eseguito alcune query scompare.
Secondo messaggio che indica il tentativo di creare tabella esistente già esistente in questo caso è abbastanza strano.
Sono abbastanza confuso e non riesco a capire cosa sta succedendo qui. Il mio codice è simile al seguente:
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]);
Dopo che questo codice è stato eseguito, il file DB esiste ma è vuoto. Quando viene eseguita la prima query (e tutte le successive), mi viene restituito l'errore sopra e il file scompare.
Qualcuno ha un'idea di cosa c'è che non va?
Grazie mille per avermi indicato nel modo giusto!
Grazie per una punta, interessa e ho intenzione di provarlo.Ma non è lo stesso quando tutte le istanze di NSPersistentStoreCoordinator vengono rilasciate appena prima che il file venga rimosso? Questo è ciò che accade prima di chiamare il mio metodo sopra. Suppongo che rimuoverà e libererà anche tutte le strutture dati successive. Puoi spiegare perché è importante rimuovere esplicitamente lo store persistente dal coordinatore prima di rimuovere il file stesso? – Burt
Quindi ho provato la soluzione e funziona! Grazie mille per questo! Tuttavia mi sto ancora chiedendo dove sia la differenza tra rimuovere esplicitamente lo store persistente e rilasciare semplicemente il coordinatore. – Burt
Se si imposta 'NSPersistentStoreCoordinator' su nil all'interno di' NSManagedObjectContext' e lo si rilascia, allora probabilmente si otterrà la stessa cosa ma questo è molto più pesante del semplice istruire 'NSPersistentStoreCoordinator' per rimuovere lo store. –