【发布时间】:2014-04-22 19:46:17
【问题描述】:
我在 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。身份验证代码负责重新初始化上下文。还在为一个看似简单的问题头疼。
【问题讨论】:
-
你在保存上下文吗?
-
在 A) 中删除所有对象后,您似乎没有保存托管对象上下文。总体而言,更好的方法可能是确保您没有加载任何对象,删除上下文和持久存储,删除文件并重新开始,创建新的上下文和持久存储。
-
我们应该关闭这个问题。我找到了答案,结果不是数据删除问题。因此,让我们将其作为其他删除所有对象问题的欺骗来结束。
标签: ios objective-c core-data