【问题标题】:iOS - CoreData deleting objects doesn't free disk spaceiOS - CoreData 删除对象不会释放磁盘空间
【发布时间】:2015-10-25 09:49:57
【问题描述】:

我正在使用这种方法删除 CoreData 对象:

    NSManagedObjectContext *theContext = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:nameEntity];
[fetchRequest setIncludesPropertyValues:NO]; //only fetch the managedObjectID
[fetchRequest setPredicate:predicate];
NSError *error;
NSArray *fetchedObjects = [theContext executeFetchRequest:fetchRequest error:&error];
for (NSManagedObject *object in fetchedObjects)
{
    [theContext deleteObject:object];
}

error = nil;
if(![theContext save:&error]){
    NSLog(@"Couldn't save: %@", error);
}

我不明白的是,例如我下载数据并存储它,在设置中我可以看到我的应用程序使用了 5MB 的磁盘空间。 一旦我使用这种方法删除数据,它就会说我的应用程序使用了 6.3MB 的数据。 这完全没有任何意义。我究竟做错了什么?为什么数据没有被正确删除?

【问题讨论】:

  • 数据删除后还能访问吗?因为如果不能,则数据正确删除。我不确定是否有任何文档承诺在删除操作后立即释放磁盘空间。 (如果我错了,请随时纠正我。)

标签: ios objective-c core-data


【解决方案1】:

您可以打开核心数据存储并设置 SQLite 真空选项以回收磁盘空间。例如

NSDictionary *storeOptionsDict=@{NSSQLiteManualVacuumOption : @YES};
[persistentStoreCoordinator addPersistentStoreWithType: NSSQLiteStoreType configuration: nil URL: sourceStoreURL options: storeOptionsDict error: &error];

查看这个老问题:How to VACUUM a Core Data SQLite db?

【讨论】:

  • 感谢您的回答。我已经这样做了,但我认为没有立竿见影的效果。这是正常的吗?谢谢!
  • 它适用于我的 OS X 应用程序(它使用旧式删除日志模式核心数据设置),从 80 MB 文件中回收 30 MB。也许 WAL 模式和 iOS 上的工作方式不同。 PSC 设置代码是否在您期望的时候被调用?也许您可以编写一个简化的测试应用程序来验证您的配置的行为。
  • 是的,当我期望它调用 PSC 设置代码时。我会进行更多测试,但非常感谢您提供的信息。
【解决方案2】:

使用 sqlite 存储时,存储由 sqlite 管理,而不是核心数据框架本身。当您删除一个托管对象时,该行将从相应的表中删除。在典型的数据库中,这不会导致释放任何磁盘空间。至于为什么使用的空间实际上可能会增加,这是我的猜测,但我认为这是因为事务日志记录。即使事务完成,日志也不会立即清除。

我建议你不要担心这个。 sqlite 库将对压缩表进行内部管理(从已删除的行中回收空间)并清除旧的事务记录。

【讨论】:

  • 非常感谢您的回答。关键是我想让我的用户在需要内存时删除一些数据。那么如果需要内存,是否会被删除和释放?
猜你喜欢
  • 1970-01-01
  • 2019-01-15
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-10
相关资源
最近更新 更多