我已经在SO中关注了各种帖子,以便从应用中删除所有数据,以便重新开始。我试过了:
A)删除所有数据:
NSArray *entities = model.entities;
for (NSEntityDescription *entityDescription in entities) {
[self deleteAllObjectsWithEntityName:entityDescription.name
inContext:context];
}
if ([context save:&error]) {
...
- (void)deleteAllObjectsWithEntityName:(NSString *)entityName
inContext:(NSManagedObjectContext *)context
{
NSFetchRequest *fetchRequest =
[NSFetchRequest fetchRequestWithEntityName:entityName];
fetchRequest.includesPropertyValues = NO;
fetchRequest.includesSubentities = NO;
NSError *error;
NSArray *items = [context executeFetchRequest:fetchRequest error:&error];
for (NSManagedObject *managedObject in items) {
[context deleteObject:managedObject];
NSLog(@"Deleted %@", entityName);
}
}
B)删除物理数据存储:
NSError *error;
NSPersistentStore *store = [[self persistentStoreCoordinator].persistentStores lastObject];
NSURL *storeURL = store.URL;
NSPersistentStoreCoordinator *storeCoordinator = store.persistentStoreCoordinator;
[self.diskManagedObjectContext reset]; // there is a local instance variable for the disk managed context
[storeCoordinator removePersistentStore:store error:&error];
[[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error];
_diskManagedObjectContext = nil;
C)执行步骤A,然后执行步骤B
在所有组合中,它似乎运行时没有错误,但每当我收到新数据(通过我的HTTP服务)并开始将其添加到重新初始化的数据存储时,我会得到各种重复数据和各种数据问题。我通常必须删除并重新安装应用程序才能使数据足够干净以重新初始化。
应该相当简单。用户登录。应用程序数据被下载并保存在商店中。用户注销并再次登录,或者随着ID和新数据的不同而被删除。
为什么上述方法不起作用的任何想法?
更新:
我编辑了上面的代码,表明我正在保存上下文并删除数据存储文件。我仍然最终得到了糟糕的剩余数据。问题可能是我们使用的多种情境吗?我们在应用程序中使用了三种上下文:UI管理的上下文,后台上下文和磁盘管理的上下文。通知侦听器负责将后台上下文中的更改与磁盘管理上下文合并。
我尝试改变上面的代码来遍历所有三个上下文中的对象,并将它们全部设置为nil。身份验证代码负责重新初始化上下文。仍然在看似简单的问题上喋喋不休。
答案 0 :(得分:0)
之后
for (NSEntityDescription *entityDescription in entities) {
[self deleteAllObjectsWithEntityName:entityDescription.name
inContext:context];
}
保存您的背景
[context save:&error];
答案 1 :(得分:0)
(B)不会删除实体店,它只会暂时将其与您的应用分开。毫无疑问,您只是在此后不久或下次发布时再次附加它。
实际使用[[NSFileManager defaultManager] removeItemAtURL:... error:...]
从磁盘中删除文件。
正如其他海报所说,你在(A)中没有NSManagedObjectContext -save:
,所以你影响那个上下文中的内容,但不影响持久性商店中的内容。上下文只是内存中的暂存区,因此只要您创建新的上下文,它就能够再次查找持久存储中的所有内容,除非您保存修改后的内容。