Iphone 核心数据:为什么删除sqlite文件并没有立即清除之前插入的所有数据?
我想通过删除应用程序的sqlite文件来重置数据存储。我在data helper类中编写了此函数: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
-(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>