删除我的核心数据存储中的所有数据

Posted

技术标签:

【中文标题】删除我的核心数据存储中的所有数据【英文标题】:Delete all my data in my Core Data store 【发布时间】: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) 中删除所有对象后,您似乎没有保存托管对象上下文。总体而言,更好的方法可能是确保您没有加载任何对象,删除上下文和持久存储,删除文件并重新开始,创建新的上下文和持久存储。 Core Data: Quickest way to delete all instances of an entity的可能重复 我们应该关闭这个问题。我找到了答案,结果不是数据删除问题。因此,让我们将其作为其他删除所有对象问题的欺骗来结束。 【参考方案1】:

之后

for (NSEntityDescription *entityDescription in entities) 
[self deleteAllObjectsWithEntityName:entityDescription.name
                           inContext:context];

保存你的上下文

[context save:&error];

【讨论】:

对我的问题中的错误传达感到抱歉。我正在保存上下文,但忘记在代码中包含它。【参考方案2】:

(B) 不会删除实体店,只是暂时将其与您的应用分离。毫无疑问,您只是在此后不久或下次发布时再次附加它。

实际使用[[NSFileManager defaultManager] removeItemAtURL:... error:...] 从磁盘中删除文件。

正如其他发帖人所说,您未能在 (A) 中 NSManagedObjectContext -save:,因此您影响了该上下文中的内容,但不会影响持久存储中的内容。上下文只是内存中的便签本,因此一旦您创建了一个新上下文,它将能够再次在持久存储中找到所有内容,除非或直到您保存修改后的内容。

【讨论】:

我会看看这个。我在代码中确实有 removeItemAtURL ,但目前它已被注释掉。我将取消注释、测试并返回。 我在删除文件时添加了回来,但仍然没有更好的结果。上面编辑的帖子。 所以你是说磁盘上根本没有持久存储,你已经清空了你的上下文,但是数据却神奇地不知从何而来? 不,数据似乎是空的,但是当我从服务器获取新数据时,我得到了重复的记录以及新旧数据的混合。有时我只得到几个骗子,有时是十几个。 我应该澄清一下,来自我们的 http 服务的数据格式正确,但在导入后,我们会看到全新安装和导入时不存在的各种数据问题。

以上是关于删除我的核心数据存储中的所有数据的主要内容,如果未能解决你的问题,请参考以下文章

快速删除过去保存的核心数据条目

从核心数据中删除实体

核心数据 - 删除持久存储时出现死锁

MagicalRecord 重新启动应用程序时删除核心数据存储

你如何删除存储在网络上的 Sembast db 中的所有数据?扑

核心数据迁移:除了少数特定对象之外,是不是可以删除旧存储?