In my app I sometimes need to rebuild and repopulate database file. SQLite databse is created and managed by CoreData stack.
What I’m trying to do is drop the file and then simply recreate persistentStoreCoordinator object.
It works under simulator but not on device, where I’m getting such an error:
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';
I cannot find the cause of this in any way. It indicates two different problems – Cocoa error 256 indicates that file does not exist or is not readable. But file IS created after creating persistenStoreCoordinator, although it’s empty, but after executing some queries it disappears.
Second message indicating attempt to create alredy existing table is quite strange in that case.
I’m quite confused and cannot get the point what’s going on here. My code looks like this:
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]);
After this code is exectued, DB file exists but is empty. When then first query (and all following) is executed, it gives me the error above and file disappears.
Does anybody has an idea what’s wrong with it?
Big thanks for pointing me the right way!
The Core Data stack does not like you removing the file under it. If you are wanting to delete the file you should tear down the stack, delete the file and then reconstruct the stack. That will eliminate the issue.
Part of the problem is that the stack keeps a cache of the data that is in the file. When you remove the file you don’t have a way to clear that cache and you are then putting Core Data into an unknown and unstable state.
You can try telling the
NSPersistentStoreCoordinatoryou are removing the file with a call to-removePersistentStore:error:and then adding the new store with a call to-addPersistentStoreWithType:configuration:URL:options:error:. I am doing that currently in ZSync and it works just fine.