我的应用程序为Core Data持久存储中的当前用户存储了大量数据。如果用户注销,我想删除所有这些数据并重新开始。
现在,我的代码如下:
NSError *error;
[_managedObjectContext lock];
[_managedObjectContext reset];
[_persistentStoreCoordinator removePersistentStore:_persistentStore error:&error];
[[NSFileManager defaultManager] removeItemAtURL:[_persistentStore URL] error:&error];
// error handling here
_persistentStore = [_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[self _storeURL] options:nil error:&error];
[_managedObjectContext unlock];
但无论我做什么,下次我执行获取请求时,我都会收到所有旧数据。我已经验证了实际文件是从文件系统中删除的,所以显然这些数据来自某个地方的内存。我已经尝试了上面的代码,我已经尝试将托管对象上下文重置为nil并从头开始重新开始,但是在我终止应用程序并重新运行它之前,似乎没有任何更改发生。
编辑:实际上,甚至没有终止应用程序做任何事情。我看到sqlite文件从NSFileManager
行之后的文件夹中消失,然后在我添加新持久存储的行上,它重新创建了旧的持久存储的精确副本。
removePersistentStore:
,我就会看到“与sqlite数据库断开连接”。下一行addPersistentStoreWithType:
,我看到大量的INSERT
语句,我猜是从内存中神奇地恢复数据库的内容?我可以得到它......不这样做吗?
编辑:嗯,现在我刚刚通过循环管理对象手动删除数据存储的内容。不管怎么说,这都有效。幸运的是,对于这个项目,用户只有几百个对象,所以它不是非常耗时,但我仍然希望我明白发生了什么......
答案 0 :(得分:0)
拆除整个堆栈,然后删除该文件。如果您正在使用UIManagedDocument,那么您有一个文件包。确保关闭文档,然后删除整个文件包。
答案 1 :(得分:0)
我对我们正在进行的项目感到担心,所以我做了一个测试,但我不能让它显示你所看到的行为。这完全在iOS 5.1的模拟器中。
我刚刚在Apple的默认核心数据模板中尝试了以下代码,其模型具有单个实体“Entity”,其字符串属性称为“name”。代码插入实体,保存上下文,删除存储,删除存储文件,然后重新添加存储。在移除商店之前存在对象,之后不存在,如预期的那样。 (我也尝试添加managedObject锁/重置/解锁,结果相同。)
所以,必须有其他事情发生。你可以试着像这样做一个简化的测试用例吗?
NSManagedObject *object = [[NSManagedObject alloc] initWithEntity:[NSEntityDescription entityForName:@"Entity"
inManagedObjectContext:self.managedObjectContext]
insertIntoManagedObjectContext:self.managedObjectContext];
[object setValue:@"hi" forKey:@"name"];
NSError *error;
if (![self.managedObjectContext save:&error]) {
NSLog(@"error: %@",error);
}
NSFetchRequest *fetch = [[NSFetchRequest alloc] initWithEntityName:@"Entity"];
[fetch setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]]];
NSLog(@"before: %@", [self.managedObjectContext executeFetchRequest:fetch error:nil]);
if (![self.persistentStoreCoordinator removePersistentStore:[[self.persistentStoreCoordinator persistentStores] lastObject]
error:&error]) {
NSLog(@"error: %@", error);
}
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreDataTest.sqlite"];
if (![[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error]) {
NSLog(@"error: %@", error);
}
if (![self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:storeURL
options:nil
error:&error]) {
NSLog(@"error: %@", error);
}
NSLog(@"after: %@", [self.managedObjectContext executeFetchRequest:fetch error:nil]);