Reputation: 16758
In my ios app, I am using Magical Record and NSFetchedResultsController. I am trying to implement below functionality:
To delete all his data I wrote below code:
- (void)cleanAndResetupDB
{
[MagicalRecord cleanUp];
BOOL isSuccess = YES;
for (NSString *dbStore in [self dbBackups]) {
NSError *error = nil;
NSURL *storeURL = [NSPersistentStore MR_urlForStoreName:dbStore];
if(![[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error]){
NSLog(@"An error has occurred while deleting %@", dbStore);
NSLog(@"Error description: %@", error.description);
isSuccess = NO;
}
}
if (isSuccess) {
[MagicalRecord setupCoreDataStackWithStoreNamed:CRP_DB];
}
}
- (NSArray *)dbBackups
{
NSString *shmFileName = [NSString stringWithFormat:@"%@-shm",CRP_DB];
NSString *walFileName = [NSString stringWithFormat:@"%@-wal",CRP_DB];
return @[CRP_DB,shmFileName,walFileName];
}
When registration is complete user is navigated to contacts screen, where we retrieve related contacts from server and store it in local DB. Since FRC is used to retrieve data from local DB and show it in table view, as soon as data is saved in db it automatically appears in table view.
Problem is- If I quit the app after removing local db, on relaunch it shows proper records, but if I don't quit the app after removing local db, then it shows duplicate records.
Any clues?
Upvotes: 1
Views: 491
Reputation: 16714
If you are using Core Data and you want to remove your database, you have to actually remove your persistent store. Simply deleting the database files is not enough. Core Data caches objects in memory and if it doesn't know that they should be deleted, they could be re-committed to the database. In particular, you are missing the call to removePersistentStore:error:
.
NSPersistentStoreCoordinator *storeCoordinator = ...; // you should already have a persistent store coordinator
NSURL *storeURL = [NSPersistentStore MR_urlForStoreName:dbStore];
[storeCoordinator removePersistentStore:store error:&error];
[[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error];
Upvotes: 2