CoreData(用于iphone)存储图像

时间:2010-01-25 10:55:11

标签: iphone objective-c xcode core-data binary

我想知道将核心数据图像存储到二进制属性

是否是明智的选择

说我有一组电影,我想将图像DVD封面保存到一个属性,封面的平均大小是20 / 30kb(320x480px)

我想这样做的原因是为了存储管理,一旦我删除电影,我知道图像也被删除

我不太确定这是一个好主意,数据加载,速度?

任何人都有这方面的经验吗?

4 个答案:

答案 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文件。