为什么我不能重置持久性商店的内容?

时间:2012-07-31 00:09:57

标签: ios core-data

我的应用程序为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行之后的文件夹中消失,然后在我添加新持久存储的行上,它重新创建了旧的持久存储的精确副本。

编辑:好的,我打开了Core Data调试。一旦我调用removePersistentStore:,我就会看到“与sqlite数据库断开连接”。下一行addPersistentStoreWithType:,我看到大量的INSERT语句,我猜是从内存中神奇地恢复数据库的内容?我可以得到它......不这样做吗?

编辑:嗯,现在我刚刚通过循环管理对象手动删除数据存储的内容。不管怎么说,这都有效。幸运的是,对于这个项目,用户只有几百个对象,所以它不是非常耗时,但我仍然希望我明白发生了什么......

2 个答案:

答案 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]);