Волшебная запись - повторяющиеся записи появляются, даже если файл БД удален

В моем приложении ios я использую Magical Record и NSFetchedResultsController. Я пытаюсь реализовать ниже функциональность:

  1. Пользователь переходит на экран настроек
  2. Он выбирает - "Удалить учетную запись"
  3. Все его данные удалены
  4. Он перешел на экран перерегистрации

Чтобы удалить все свои данные я написал ниже код:

- (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];
Другие вопросы по тегам