Волшебная запись - повторяющиеся записи появляются, даже если файл БД удален
В моем приложении ios я использую Magical Record и NSFetchedResultsController. Я пытаюсь реализовать ниже функциональность:
- Пользователь переходит на экран настроек
- Он выбирает - "Удалить учетную запись"
- Все его данные удалены
- Он перешел на экран перерегистрации
Чтобы удалить все свои данные я написал ниже код:
- (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];
}
Когда регистрация завершена, пользователь переходит на экран контактов, где мы получаем соответствующие контакты с сервера и сохраняем их в локальной БД. Поскольку FRC используется для извлечения данных из локальной БД и отображения их в табличном представлении, как только данные сохраняются в БД, они автоматически отображаются в табличном представлении.
Проблема в том, что если я покидаю приложение после удаления локальной базы данных, то при повторном запуске она показывает правильные записи, но если я не закрываю приложение после удаления локальной базы данных, то отображаются дублированные записи.
Есть какие-нибудь подсказки?
1 ответ
Если вы используете Core Data и хотите удалить свою базу данных, вы должны фактически удалить свое постоянное хранилище. Простого удаления файлов базы данных недостаточно. Базовые данные кэшируют объекты в памяти, и если они не знают, что их следует удалить, они могут быть повторно переданы в базу данных. В частности, вы пропускаете звонок 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];