簡體   English   中英

核心數據可轉換以檢索圖像

[英]Core Data and Transformable To Retrieve Image

我正在嘗試使用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上設置任何圖像。

關於此的任何幫助將是巨大的。 我也對將視頻存儲在核心數據中感到困惑。 請提出正確的處理方法。

這是因為您正在使用imageNamed:創建圖像。 由於核心數據(或可能是帶密鑰的存檔)中存在明顯的錯誤,因此以這種方式創建的圖像無法保存到核心數據可轉換屬性中。 沒有錯誤發生,但是以后無法檢索圖像。 rdar://20717042對於可能感興趣的任何人)。

如果您以其他方式創建圖像,則它應該可以工作。 例如,如果您使用imageWithContentsOfFile:那就可以了。 但是您不能在此處使用imageNamed:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM