在我的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用于从本地DB检索数据并在表视图中显示,因此只要数据保存在db中,它就会自动显示在表视图中。
问题是 - 如果我在删除本地数据库后退出应用程序,重新启动时会显示正确的记录,但如果我在删除本地数据库后没有退出应用程序,则会显示重复的记录。
任何线索?
答案 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];