Iphone 核心数据:为什么删除sqlite文件并没有立即清除之前插入的所有数据?

Iphone 核心数据:为什么删除sqlite文件并没有立即清除之前插入的所有数据?,iphone,objective-c,ipad,ios,core-data,Iphone,Objective C,Ipad,Ios,Core Data,我想通过删除应用程序的sqlite文件来重置数据存储。我在data helper类中编写了此函数: -(void) resetPersistenStore { NSError *error = nil; [persistentStoreCoordinator_ release]; NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"MyApp.sqlit

我想通过删除应用程序的sqlite文件来重置数据存储。我在data helper类中编写了此函数:

-(void) resetPersistenStore {
    NSError *error = nil;
    [persistentStoreCoordinator_ release];
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"MyApp.sqlite"];
    [[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error];
    if (error) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    }
    persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
    managedObjectModel_ = nil;
}
我将以下测试放在UIApplication::didFinishLaunchingWithOptions中

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

    /* test */
    [TestDataHelper populateTestData:[self managedObjectContext]];
    [TestDataHelper populateTestData:[self managedObjectContext]]; 
    [self resetPersistenStore];
    [TestDataHelper populateTestData:[self managedObjectContext]]; 
    [TestDataHelper testPopulateTestData:[self managedObjectContext]];
我实际上可以看到三组数据,而不是由函数populateTestData创建的一组数据(因为我调用了函数三次)

很明显,resetPersistenStore()是有效的,因为没有它,数据将不断累积

所以我的问题是:

为什么重置不会立即生效?

我在reset函数中将managedObjectContext设置为nil,但没有帮助

这是我的populateTestData函数

+(void)populateTestData:(NSManagedObjectContext*)managedObjectContext {

    Stock* s1 = (Stock*)[NSEntityDescription insertNewObjectForEntityForName:@"Stock" 
                                                                     inManagedObjectContext:managedObjectContext];
    s1.code = @"ABC2";
    s1.name = @"ABC";
    s1.enteredBy = @"akong";

    [managedObjectContext save:&error]; 

    if (error) {
        NSLog(@"Data error %@", [error description]);
    } else {
        NSLog(@"Init completed");
    }
}

即使上下文将数据保存在
populateTestData
中,它仍然加载了数据

假设应用程序启动时,文件有3个对象。现在,第一条
populateTestData
消息将一个对象添加到上下文中,并保存它。因此,文件中有4个对象,上下文中有1个。在第二条消息之后,5在文件中,2在上下文中。现在该文件已消失,但上下文中仍有2个。现在,最后一条消息将另一个对象添加到上下文和文件中,因此有3个对象


您说过在重置函数中将managedObjectContext设置为nil没有帮助。我怀疑上下文是否已在那里正确重置。请改为尝试[managedObjectContext reset]。

即使上下文将数据保存在
populateTestData
中,它仍然加载了数据

假设应用程序启动时,文件有3个对象。现在,第一条
populateTestData
消息将一个对象添加到上下文中,并保存它。因此,文件中有4个对象,上下文中有1个。在第二条消息之后,5在文件中,2在上下文中。现在该文件已消失,但上下文中仍有2个。现在,最后一条消息将另一个对象添加到上下文和文件中,因此有3个对象


您说过在重置函数中将managedObjectContext设置为nil没有帮助。我怀疑上下文是否已在那里正确重置。请改为尝试[managedObjectContext reset]。

我只是在这里猜测,但您是否有可能使用fetchedResultsController来验证/显示这些操作的结果?如果是这样,尝试将其缓存设置为nil,看看是否有帮助

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"xxxxxxxx" cacheName:nil];
干杯,
Rog

我只是在这里猜测,但是您是否有可能使用fetchedResultsController来验证/显示这些操作的结果?如果是这样,尝试将其缓存设置为nil,看看是否有帮助

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"xxxxxxxx" cacheName:nil];
干杯,
Rog

它可能只是模拟器的一个工件。如果您在模拟器中运行,可能需要重置它。从iOS模拟器菜单中,选择重置内容和设置…

它可能只是模拟器的一个工件。如果您在模拟器中运行,可能需要重置它。从iOS模拟器菜单中,选择重置内容和设置…

我在managedObjectModel_u2;=nil之前添加了[managedObjectContext Reset];但在managedObjectModel=nil之前添加[managedObjectContext reset]没有任何效果;但它没有任何效应器,请删除缓存:
[NSFetchedResultsController deleteCacheWithName:][/code>或删除缓存:
[NSFetchedResultsController deleteCacheWithName:][/code>