我想知道将核心数据图像存储到二进制属性
是否是明智的选择说我有一组电影,我想将图像DVD封面保存到一个属性,封面的平均大小是20 / 30kb(320x480px)
我想这样做的原因是为了存储管理,一旦我删除电影,我知道图像也被删除
我不太确定这是一个好主意,数据加载,速度?
任何人都有这方面的经验吗?
答案 0 :(得分:11)
在我看来,将图像存储在核心数据中并不是一个好主意,而且我很确定我也会在Apple的一个编程指南中阅读它。考虑到这一点,当您获取集合时,所有图像也将被加载到内存中,即使您只显示8个图像,您的整个图像集也将被核心数据加载。
如果您想确保删除移动记录时删除图像文件,我建议您通过managedObjectContext收听通知并删除电影时删除文件:
您可以注册willSave或didSave通知,每个通知都有自己的优点/缺点。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contextDidSave:) name:NSManagedObjectContextDidSaveNotification object:managedObjectContext];
获取已删除的对象:
- (void) contextDidSave:(NSNotification *)notification
{
NSDictionary *userInfo = [notification userInfo];
for (NSManagedObject *currObject in [userInfo objectForKey:NSDeletedObjectsKey])
{
// Code for deleting file associated with the NSManagedObject, you can still
// access the managed object's properties.
}
}
答案 1 :(得分:7)
最好的方法是在托管对象中存储图像的路径,然后在对象的prepareForDeletion
方法中删除该文件。
答案 2 :(得分:1)
我想到你可以使用另一种方法,如果你已经为你的电影实体继承了NSManagedObject,那可能会更好。
您可以在NSManagedObject上实现didSave或willSave方法并检查isDeleted属性。如果已删除,请从磁盘中删除该图像。
答案 3 :(得分:0)
请参阅我的回答:
Can I access the files used for external binary storage in Core Data?
您现在可以使用“允许外部存储”选项将大型文件存储在Core Data中。唯一的问题是不再能够通过路径访问实际文件,只能访问纯二进制数据。我提出了一个“创造性”的解决方案(无论是最好的做法都是猜测),但它允许您使用Core Data来管理文件,同时仍然能够通过路径访问REAL文件。