首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在核心数据中存储图像

如何在核心数据中存储图像
EN

Stack Overflow用户
提问于 2013-05-22 15:24:35
回答 3查看 83.3K关注 0票数 76

我是iOS的新手。我一直在尝试制作一个应用程序,将从相机捕获的图像存储到CoreData中。我现在知道如何存储NSStrings、NSDate和其他类型的数据,但很难存储图像。我读过很多文章,说你必须把它写到磁盘上,然后写到一个文件里,但我似乎不能理解。

下面的代码是我用来将其他数据存储到核心数据的代码。

- (IBAction)submitReportButton:(id)sender
{
    UrbanRangerAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

    managedObjectContext = [appDelegate managedObjectContext];

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"PotholesDB" inManagedObjectContext:appDelegate.managedObjectContext];
    NSManagedObject *newPothole = [[NSManagedObject alloc]initWithEntity:entity insertIntoManagedObjectContext:managedObjectContext];


    [newPothole setValue:self.relevantBody.text forKey:@"relevantBody"];
    [newPothole setValue:self.subjectReport.text forKey:@"subjectReport"];
    [newPothole setValue:self.detailReport.text forKey:@"detailReport"];
//    [newPothole setValue:self.imageView forKey:@"photo"];

    NSDate *now = [NSDate date];
    //NSLog(@"now : %@", now);
    NSString *strDate = [[NSString alloc] initWithFormat:@"%@", now];
    NSArray *arr = [strDate componentsSeparatedByString:@" "];
    NSString *str;
    str = [arr objectAtIndex:0];
    NSLog(@"now : %@", str);

    [newPothole setValue:now forKey:@"photoDate"];
    [newPothole setValue:self.latitudeLabel.text forKey:@"latitude"];
    [newPothole setValue:self.longitudeLabel.text forKey:@"longitude"];
    [newPothole setValue:self.addressLabel.text forKey:@"streetName"];
    [newPothole setValue:streeNameLocation forKey:@"location"];


    NSError *error;
    [managedObjectContext save:&error];

    UIAlertView *ll = [[UIAlertView alloc] initWithTitle:@"Saving" message:@"Saved data" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];

    [ll show];
} 
EN

回答 3

Stack Overflow用户

发布于 2013-11-27 15:00:15

在xcdatamodelId子类中将图像实体声明为NSData...您不能使用UIImage格式,因为图像数据是二进制格式。

@property (nonatomic, retain) NSData *imag;

在实现文件中..将UIImage转换为NSData

UIImage *sampleimage = [UIImage imageNamed:@"sampleImage.jpg"];

NSData *dataImage = UIImageJPEGRepresentation(sampleimage, 0.0);

然后最后保存它

[obj setValue:dataImage forKey:@"imageEntity"]; // obj refers to NSManagedObject
票数 13
EN

Stack Overflow用户

发布于 2013-05-22 16:44:14

- (void)imageChanged:(UIImage*)image{

    if (self.detailItem) {
        [self.detailItem setValue:UIImagePNGRepresentation(image) forKey:kSignatureImage];
    }
}

这是一个非常简短的例子。self是一个使用核心数据的视图控制器,而self.detailItem是通常的NSManagedObject。在该项目中,我没有为实体创建模型类,而是严格使用KVC模式来访问属性。正如您可能猜到的,该属性名为"signatureImage",这是我在#define常量kSignatureImage中定义的。

这是从核心数据恢复映像的位置:

self.signatureCanvas.image =  [UIImage imageWithData:[self.detailItem valueForKey:kSignatureImage]];

同样,self是一个视图控制器,signatureCanvas是一个UIImageView子类,.image是它从UIImageView继承的常规image属性。同样,detailItem也是通常的NSManagedObject

这个例子取自我目前正在做的一个项目。

在核心数据中存储像图像这样的大型数据对象或将它们分离在文件中是有优缺点的。将它们存储在文件中意味着您要负责在删除相关数据对象时将其删除。这提供了编码开销,并且对于编程错误可能是易失性的。另一方面,它可能会减慢底层数据库的速度。关于性能,我还没有足够的经验来分享这种方法。最后,占用的磁盘存储空间在总大小上大致相同。

票数 4
EN

Stack Overflow用户

发布于 2013-05-22 15:44:54

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16685812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档