将照片保存到核心数据

时间:2013-08-07 16:42:46

标签: ios core-data save photo

我想将照片保存到Core Data。我在互联网上查找并找到许多关于核心数据的资源,但是找不到我想要完成的资源。我想使用Core Data来保存用户已经拍摄的图像,然后希望用户选择他想要保存的类别。就像他正在将图片分类为类别,例如肉类或蔬菜等。为此,我创建了一个名为photo的实体,并将类别的6个属性名称作为例如肉类蔬菜。我还没有选择类型。我在想用户选择类别并保存属性。这是问题所在。我想这样做,但我找不到满足我想做的资源。我也正在考虑使用多个属性吗?

2 个答案:

答案 0 :(得分:1)

向下滚动以将UIImage数据存储在核心数据中,但首先是关于核心数据属性:您不应该为不同的类别使用多个属性,您应该有一个名为“category”的属性。这可以是整数或字符串,具体取决于您的实现。我建议使用整数并为其定义枚举,如下所示:

typedef NS_ENUM(NSUInteger, MyFoodCategory){
    MyFoodCategoryVegetable = 0,
    MyFoodCategoryMeat = 1,
    MyFoodCategoryFish = 2,
    MyFoodCategorySweet = 3,
};

当您将其打印到视图时,请执行以下操作:

-(void)setLabelTextForCategory:(MyFoodCategory)category
{
    switch(category) {
        case MyFoodCategoryVegetable:
            self.categoryLabel.text = @"Vegetable";
            break;
        case MyFoodCategoryMeat:
            self.categoryLabel.text = @"Meat";
            break;
        case MyFoodCategoryFish:
            self.categoryLabel.text = @"Poisson"; //French
            break;
        case MyFoodCategorySweet:
            self.categoryLabel.text = @"Dessert";
            break;
    }
}

这意味着如果您改变主意,想要为每个类别打印哪个测试,那么您只需要在这个位置更改它,而不必更改核心数据库中的内容。例如,您可以使用本地化来显示同一单词的不同语言或变体。

将UIImage数据存储在核心数据中

好的,所以回答你的主要问题。我个人会避免将图像数据存储在核心数据中,我会将其保存到磁盘中。查看使用NSFileManager类或将UIImage转换为NSData并写入文件,例如

UIImage *image = ...
NSData *imageData = UIImagePNGRepresentation(image); // or use UIImageJPEGRepresentation if it's a jpeg image

NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *fileName = @"imageWhatever1";
NSString *filePath = [documentsPath stringByAppendingPathComponent:fileName];
NSError *writeError = nil;
if (![data writeToFile:filePath options:NSDataWritingAtomic error:&writeError]) {
    NSLog(@"Failed to write file: %@", writeError);
}

但是,如果您希望将图像直接保存到核心数据,则创建一个名为“imageData”的属性,并将“属性类型”设置为“二进制数据”。然后将NSData对象保存到核心数据实体。当您读取NSData对象时,可以按如下方式将其转换回UIImage:

UIImage *imageLoadedFromDiskOrCoreData = [UIImage imageWithData:imageData];

答案 1 :(得分:0)

没有。这不是一个好方法。目前,每个six attributes的{​​{1}}为entity。这将导致为数据库中的每一行创建无用的5个属性

您可以为enum创建Category,并将enum值存储在coreData中,而不是这样。

这样您就可以在enum中添加任意数量的类别,以便日后增强,并且您无需关心coreData中存储的内容。

就像这样。

typedef enum imageType {
     vegetables = 0,
     fruits = 1,
     animals = 2,
     scenaries = 3,
     Nature = 4,
     Home = 5,
     Architecture = 6
}

并且您的coreData实体就是这样。

<强> ImageEntity

 NSData *imageData;
 NSNumber *typeEnum;

您可以拥有一个包含类别名称的数组,并在整个应用中使用它,以使enumUIPickerView或其他组件中类别的确切名称相匹配。< / p>

你的阵列可能是这样的。

NSArray *categoryArray = [NSArray arrayWithObjects:@"vegetables", @"fruits", @"animals", @"scenaries", @"Nature", @"Home", @"Architecture", nil];

你可以像这样访问数组对象。

NSString *imageCategory = [categoryArray objectAtIndex:imageType.animals];