魔法记录 - 即使删除了DB文件,也会出现重复记录

时间:2014-07-20 09:01:48

标签: ios core-data nsfetchedresultscontroller magicalrecord

在我的ios应用程序中,我正在使用Magical Record和NSFetchedResultsController。我正在尝试实现以下功能:

  1. 用户导航至设置屏幕
  2. 他选择了 - '删除帐户'
  3. 他的所有数据都已删除
  4. 导航到重新注册屏幕
  5. 要删除我在下面编写的所有数据代码:

    - (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用于从本地DB检索数据并在表视图中显示,因此只要数据保存在db中,它就会自动显示在表视图中。

    问题是 - 如果我在删除本地数据库后退出应用程序,重新启动时会显示正确的记录,但如果我在删除本地数据库后没有退出应用程序,则会显示重复的记录。

    任何线索?

1 个答案:

答案 0 :(得分:2)

如果您正在使用Core Data并且想要删除数据库,则必须实际删除持久性存储。仅删除数据库文件是不够的。 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];