我的应用程序将当前用户的大量数据存储在 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
语句,我猜这些语句神奇地从内存中恢复数据库的内容?我可以让它……不要那样做吗?
编辑:好吧,现在我刚刚通过循环访问我的托管对象手动删除数据存储的内容。这工作,不知何故。幸运的是,对于这个项目,用户最多只有几百个对象,所以它不是非常耗时,但我仍然希望我能理解发生了什么......