核心数据和可转换以检索图像
Posted
技术标签:
【中文标题】核心数据和可转换以检索图像【英文标题】:Core Data and Transformable To Retrieve Image 【发布时间】:2015-08-28 19:54:24 【问题描述】:我正在尝试使用 Transformable 将图像存储在核心数据中。我看到它的方式,我已经能够将图像保存在核心数据中,但我遇到的问题是检索它。这是我到目前为止所做的事情
//NSManagedObject的自定义子类
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
#import "ImageConverter.h"
@interface Image : NSManagedObject
@property (nonatomic, retain) id storedImage;
@end
#import "Image.h"
@implementation Image
@dynamic storedImage;
@end
//NSTransformable Subclass
#import <Foundation/Foundation.h>
@interface ImageConverter : NSValueTransformer
@end
#import "ImageConverter.h"
@implementation ImageConverter
+ (Class)transformedValueClass
return [NSData class];
+ (BOOL)allowsReverseTransformation
return YES;
- (id)transformedValue:(id)value
if (value == nil)
return nil;
// I pass in raw data when generating the image, save that directly to the database
if ([value isKindOfClass:[NSData class]])
return value;
return UIImagePNGRepresentation((UIImage *)value);
- (id)reverseTransformedValue:(id)value
return [UIImage imageWithData:(NSData *)value];
@end
//ViewController 类,我将图像保存到核心数据中并在按钮单击时检索图像
#import <UIKit/UIKit.h>
#import "Image.h"
@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@end
导入“ViewController.h”
导入“AppDelegate.h”
@interface ViewController()
@结束
@implementation ViewController
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSManagedObjectContext *context = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
Image *event = [NSEntityDescription insertNewObjectForEntityForName: @"Image" inManagedObjectContext:context];
// self.imageView.image = [UIImage imageNamed:@"Bus.png"];
event.storedImage = [UIImage imageNamed:@"Bus.png"];
NSError *error = nil;
if (![context save:&error])
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
- (void)didReceiveMemoryWarning
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
- (IBAction)button:(id)sender
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init];
// NSEntityDescription *entity= [NSEntityDescription entityForName:@“Event" inManagedObjectContext : context];
//
//
NSManagedObjectContext *context = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Image" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSError *error ;
NSArray *fetchResults =
[context executeFetchRequest : fetchRequest error : &error];
for (Image *objects in fetchResults)
if(objects.storedImage != nil)
NSLog(@"%@",objects.storedImage);
self.imageView.image = objects.storedImage
@end
我希望看到检索到的图像
self.imageView.image = objects.storedImage.
但到目前为止我还没有找回它。 当我 NSLog ImageCoreData[3253:108752] UIImage: 0x7fbec1560f70, 0, 0 已检索,但 UIImageView 上未设置图像。
对此的任何帮助都会很棒。我也对将视频存储在核心数据中感到困惑。请提出正确的处理方法。
【问题讨论】:
【参考方案1】:这是因为您使用imageNamed:
创建图像。由于 Core Data(或者可能是键控存档)中的一个明显错误,以这种方式创建的图像无法保存到 Core Data 可转换属性。不会发生错误,但您以后无法检索图像。 (rdar://20717042
供任何可能感兴趣的人使用)。
如果您以任何其他方式创建图像,那么它应该可以工作。例如,如果你使用imageWithContentsOfFile:
,你会没事的。但是你不能在这里使用imageNamed:
。
【讨论】:
非常感谢汤姆哈灵顿。效果很好。以上是关于核心数据和可转换以检索图像的主要内容,如果未能解决你的问题,请参考以下文章
如何在C#中从数据库中检索时将varBinary转换为图像或视频