我正在使用此方法删除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的数据。 这完全没有意义。我究竟做错了什么?为什么数据没有被正确删除?
答案 0 :(得分:0)
使用sqlite存储时,存储由sqlite管理,而不是核心数据框架本身。删除托管对象时,将从相应的表中删除该行。在典型的数据库中,这不会导致释放任何磁盘空间。至于为什么使用的空间可能会实际增加,这个我的猜测,但我认为这是因为事务记录。即使事务已完成,也不会立即清除日志。
我建议你不要担心这个。 sqlite库将具有内部管理来压缩表(从已删除的行中回收空间)并清除旧的事务记录。
答案 1 :(得分:0)
您可以打开核心数据存储,并将SQLite vacuum选项设置为回收磁盘空间。 E.g。
NSDictionary *storeOptionsDict=@{NSSQLiteManualVacuumOption : @YES};
[persistentStoreCoordinator addPersistentStoreWithType: NSSQLiteStoreType configuration: nil URL: sourceStoreURL options: storeOptionsDict error: &error];