gpt4 book ai didi

ios - 当我只是将数据存储在内存中(而不是磁盘)时,如何有效地删除我的核心数据存储?

转载 作者:可可西里 更新时间:2023-11-01 04:15:35 26 4
gpt4 key购买 nike

我正在将 Core Data 与内存存储一起使用,我想在某个时候将其完全删除。 Most of the questions我发现与此相关的是关于磁盘存储,涉及删除存储文件或所有托管对象。

在内存中有没有更简单的方法?我可以将某些内容设置为 nil 并完成它吗?

最佳答案

如果是内存存储,请使用 removePersistentStore:error:NSPersistentStoreCoordinator 中删除存储。那时,如果需要,您可以创建一个附加到协调器的新内存存储,这将为您提供 store 级别的空白 - 这似乎是您问题的重点。

请注意,如果您保留从 NSManagedObjectContext 中获取的托管对象,这些对象可能仍然存在,并且当您删除内存存储后对它们触发故障时,它们可能会抛出异常(exception)。建议如果这很可能(通常是因为您使用的是单个上下文,或者不擅长使用 Instruments 来跟踪内存使用),您还可以在托管对象上下文上调用 reset 并且删除对托管对象的任何挥之不去的强引用。

所以使用你的代码:创建内存存储时,请指定一个 URL,以便稍后识别它:

if (![_persistentStoreCoordinator addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:[NSURL URLWithString:@"memory://0"] options:nil error:&error]) {

在您的 resetStack 方法中,您将在重置并删除托管对象上下文后将其删除:

[[self persistentStoreCoordinator] removePersistentStore:[[self persistentStoreCoordinator] persistentStoreForURL:[NSURL URLWithString:@"memory://0"] ] error:&error];

如果您不首先重置和删除上下文,您将开始看到异常,因为对象被触发了不再有存储可去的故障。

您应该在使用 Core Data 的任何地方收听 NSPersistentStoreCoordinatorStoresDidChangeNotificationNSPersistentStoreCoordinatorStoresWillChangeNotification 通知,以便在添加或删除商店时您可以采取相应的行动。例如,如果您调用删除商店的 resetStack 方法,您应该看到 NSPersistentStoreCoordinatorStoresWillChangeNotification 并利用这个机会停止您正在做的任何可能正在访问该商店的事情。当收到 NSPersistentStoreCoordinatorStoresDidChangeNotification 时,您将完成对可能正在使用 Core Data 的对象或进程的拆解 - 例如 NSFetchedResultsController 可能正在尝试访问刚刚访问的存储删除。删除旧商店后,您想要添加一个新的、干净的商店。发生这种情况时,您将收到相同的通知,其中有效负载表明已添加商店 - 届时您可以创建新的托管对象上下文和获取的结果 Controller 来替换旧的。

这实际上比听起来简单得多。尽管如此,请确保您出于正确的原因进行所有这些操作。

关于ios - 当我只是将数据存储在内存中(而不是磁盘)时,如何有效地删除我的核心数据存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23283661/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com