从 Core Data iOS 8 中删除二进制数据

Posted

技术标签:

【中文标题】从 Core Data iOS 8 中删除二进制数据【英文标题】:deleting binary data from Core Data iOS 8 【发布时间】:2015-08-24 18:20:49 【问题描述】:

我有一个允许用户从网站下载图像的应用程序。 (玩具收藏家清单 2 - https://itunes.apple.com/us/app/toy-collector-checklist-2/id919363870?mt=8)

理论上,用户可以下载数千张图片,从而造成相当大的使用量。我正在尝试添加“删除所有图像”,以便用户可以在不删除应用的情况下清除图像。

代码似乎有效。按下按钮时图像不再可见,当我检查它时核心数据值返回“nil” - 但是当我进入我的使用设置时,空间似乎没有被释放。我正在使用我认为非常标准的获取和更新代码:

CoreDataHelper *cdh =
[(AppDelegate *)[[UIApplication sharedApplication] delegate] cdh];

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
                               entityForName:@"Item"
                               inManagedObjectContext:cdh.context];
[fetchRequest setEntity:entity];
//   [fetchRequest setPredicate:nil];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"photo != nil OR photoAlt != nil OR photoCam != nil"]];
[fetchRequest setFetchBatchSize:500];
NSManagedObject *removePhotoFromObject;
NSError *error = nil;
NSArray *results = [cdh.context executeFetchRequest:fetchRequest error:&error];
for (removePhotoFromObject in results) 
    [removePhotoFromObject setValue:nil forKey:@"photoCam"];
    [removePhotoFromObject setValue:nil forKey:@"photo"];
    [removePhotoFromObject setValue:nil forKey:@"photoAlt"];
    [removePhotoFromObject setValue:nil forKey:@"thumbnail"];




[cdh backgroundSaveContext];

这会将可能的照片位置的值设置为零。如果我再次运行相同的代码,它不会将它们添加到数组中(因为它们的值现在为零),所以我知道那部分正在工作。并且图像和缩略图被删除。但是,当我检查“设置”选项卡时,数据使用情况并没有改变。

有些事情可能会破坏工作:

项目是一个实体。 photo、photoAlt 和 photoCam 也是每个实体,与 Item 具有“To One”关系

它们在模型中都被归为“二进制数据”。

任何想法和建议将不胜感激。我查看了这些论坛以及更大的互联网,但到目前为止还没有找到解决方案。

扎克

【问题讨论】:

【参考方案1】:

虽然您将关系设置为 nil,但您并没有删除关联的对象。所以我怀疑它们仍在您的数据库中。请尝试改用以下内容:

NSArray *results = [cdh.context executeFetchRequest:fetchRequest error:&error];
for (removePhotoFromObject in results) 
    if (removePhotoFromObject.photoCam) [cdh.context deleteObject:removePhotoFromObject.photoCam];
    if (removePhotoFromObject.photo) [cdh.context deleteObject:removePhotoFromObject.photo];
    if (removePhotoFromObject.photoAlt) [cdh.context deleteObject:removePhotoFromObject.photoAlt];
    if (removePhotoFromObject.thumbnail) [cdh.context deleteObject:removePhotoFromObject.thumbnail];

这应该会从您的数据库中删除对象(当您保存上下文时),但请注意,这可能不会导致使用的存储立即减少。来自CoreData Programming Guide:

简单地从 SQLite 存储中删除记录并不一定会减小文件的大小。如果删除了足够多的项目以释放​​数据库文件中的页面,SQLite 的自动数据库清理将减小文件的大小,因为它会重新排列数据以删除该页面。同样,如果您删除本身占据多个页面的项目(例如缩略图),文件大小可能会减小。

【讨论】:

我想就是这样!我必须进行另一项修改 - 而不是 NSManagedObject *removePhotoFromObject 我使用 Item *removePhotoFromObject 因为 Item 是我的自定义 NSManagedObject,这是我可以获得“。”的唯一方法。符号才能正常工作。感谢您的提示!

以上是关于从 Core Data iOS 8 中删除二进制数据的主要内容,如果未能解决你的问题,请参考以下文章

iCloud Core Data 在 Xcode 6 / ios 8 SDK 中运行后不可用

iOS Core Data 图像实际上并未被删除

当应用程序从 4.0 中的任务列表中删除时,Core Data 存储消失

RestKit / Core Data:远程删除的实体不会从 Core Data 中删除

在 IOS6 中使用 Core Data(删除/编辑)

如何在 Core Data iOS Swift 中删除和更新结构类型数组?