Siv*_*han 17 iphone core-data objective-c save uiimage
在我的应用程序中,我正在尝试保存和检索核心数据中的图像.我可以在UIimage的约定成功后将图像成功保存到NSData中,但是当我试图将图像作为NSData时,它显示如下给出的输出,
案例1:尝试从DB显示为字符串时.
<Event: 0x5b5d610> (entity: Event; id: 0x5b5ce30 <x-coredata://F51BBF1D-6484-4EB6-8583-147E23D9FF7B/Event/p1> ; data: <fault>)
Run Code Online (Sandbox Code Playgroud)
案例2:尝试显示为数据时
[Event length]: unrecognized selector sent to instance 0x5b3a9c0
2010-07-28 19:11:59.610 IMG_REF[10787:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Event length]: unrecognized selector sent to instance 0x5b3a9c0'
Run Code Online (Sandbox Code Playgroud)
我的代码,
to save:
NSManagedObjectContext *context = [self managedObjectContext];
newsObj = [NSEntityDescription insertNewObjectForEntityForName:@"Event" inManagedObjectContext:context];
NSURL *url = [NSURL URLWithString:@"http://www.cimgf.com/images/photo.PNG"];
NSData *data = [[NSData alloc] initWithContentsOfURL:url];
uiImage = [UIImage imageWithData:data];
NSData * imageData = UIImagePNGRepresentation(uiImage);
[newsObj setValue:imageData forKey:@"imgPng"];
NSError *error;
@try{
if (managedObjectContext != nil) {
if (![managedObjectContext save:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
NSString * infoString = [NSString stringWithFormat:@"Please check your connection and try again."];
UIAlertView * infoAlert = [[UIAlertView alloc] initWithTitle:@"Database Connection Error" message:infoString delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[infoAlert show];
[infoAlert release];
}
}
}@catch (NSException *exception) {
NSLog(@"inside exception");
}
Run Code Online (Sandbox Code Playgroud)
检索,
NSManagedObjectContext *context = [self managedObjectContext];
NSFetchRequest * fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity1 = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:context];
[fetchRequest setEntity:entity1];
NSError *error;
NSArray * array = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
if (array == nil) {
NSLog(@"Testing: No results found");
}else {
NSLog(@"Testing: %d Results found.", [array count]);
}
NSData * dataBytes = [[array objectAtIndex:0] data];
image = [UIImage imageWithData:dataBytes];
[fetchRequest release];
}
@catch (NSException *exception) {
NSLog(@"inside exception");
}
Error:
Testing: 3 Results found.
2010-07-28 23:27:51.343 IMG_REF[11657:207] -[Event data]: unrecognized selector sent to instance 0x5e22ce0
2010-07-28 23:27:51.344 IMG_REF[11657:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Event data]: unrecognized selector sent to instance 0x5e22ce0'
*** Call stack at first throw:
(
0 CoreFoundation 0x02566919 __exceptionPreprocess + 185
1 libobjc.A.dylib 0x026b45de objc_exception_throw + 47
2 CoreFoundation 0x0256842b -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
3 CoreFoundation 0x024d8116 ___forwarding___ + 966
4 CoreFoundation 0x024d7cd2 _CF_forwarding_prep_0 + 50
5 IMG_REF 0x00003b06 -[IMG_REFViewController showAction] + 353
6 UIKit 0x002bae14 -[UIApplication sendAction:to:from:forEvent:] + 119
7 UIKit 0x004c214b -[UIBarButtonItem(UIInternal) _sendAction:withEvent:] + 156
8 UIKit 0x002bae14 -[UIApplication sendAction:to:from:forEvent:] + 119
9 UIKit 0x003446c8 -[UIControl sendAction:to:forEvent:] + 67
10 UIKit 0x00346b4a -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 527
11 UIKit 0x003456f7 -[UIControl touchesEnded:withEvent:] + 458
12 UIKit 0x002de2ff -[UIWindow _sendTouchesForEvent:] + 567
13 UIKit 0x002c01ec -[UIApplication sendEvent:] + 447
14 UIKit 0x002c4ac4 _UIApplicationHandleEvent + 7495
15 GraphicsServices 0x02dccafa PurpleEventCallback + 1578
16 CoreFoundation 0x02547dc4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
17 CoreFoundation 0x024a8737 __CFRunLoopDoSource1 + 215
18 CoreFoundation 0x024a59c3 __CFRunLoopRun + 979
19 CoreFoundation 0x024a5280 CFRunLoopRunSpecific + 208
20 CoreFoundation 0x024a51a1 CFRunLoopRunInMode + 97
21 GraphicsServices 0x02dcb2c8 GSEventRunModal + 217
22 GraphicsServices 0x02dcb38d GSEventRun + 115
23 UIKit 0x002c8b58 UIApplicationMain + 1160
24 IMG_REF 0x00002aac main + 102
25 IMG_REF 0x00002a3d start + 53
)
terminate called after throwing an instance of 'NSException'
Run Code Online (Sandbox Code Playgroud)
注意:执行NSData*dataBytes = [[array objectAtIndex:0] data]时会出现上面的错误; 线. 数据模型http://www.freeimagehosting.net/uploads/7c286931cc.png
我花了很多时间在这上面.请帮帮我!
小智 39
不确定你是否已经理顺了这个,但我能够UIImage
在Core Data中保存/检索对象,如下所示:
要保存:
NSData *imageData = UIImagePNGRepresentation(yourUIImage);
[newManagedObject setValue:imageData forKey:@"image"];
Run Code Online (Sandbox Code Playgroud)
并加载:
NSManagedObject *selectedObject = [[self fetchedResultsController] objectAtIndexPath:indexPath];
UIImage *image = [UIImage imageWithData:[selectedObject valueForKey:@"image"]];
[[newCustomer yourImageView] setImage:image];
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.我正在使用UITableView
核心数据,并在我的tableView:didSelectRowAtIndexPath:
方法中从数据库中提取图像.
小智 26
这是适当的解决方案,非常有效.
1)使用核心数据存储UIImage:
NSData* coreDataImage = [NSData dataWithData:UIImagePNGRepresentation(delegate.dancePhoto)];
Run Code Online (Sandbox Code Playgroud)
确保"coreDataImage"属于类型NSData
.您必须在模型中为"coreDataImage"将类型设置为"二进制数据".
2)从核心数据中检索UIImage:
UIImage* image = [UIImage imageWithData:selectedDance.danceImage];
Run Code Online (Sandbox Code Playgroud)
这就是它的全部,效果很好.
当您检索图像时,您正在执行获取请求并将结果存储在变量中array
,这意味着array
保存了一个事件对象的NSArray.然后,您稍后分配:
dataBytes = [array objectAtIndex:0];
Run Code Online (Sandbox Code Playgroud)
这意味着dataBytes
,您声明为NSData,现在实际上是Event的一个实例.然后当你去初始化图像时,部分执行imageWithData:
调用length
它期望成为你的NSData对象,但实际上是一个Event对象,因此是错误消息.
您应该将代码调整为:
dataBytes = [[array objectAtIndex:0] imgPng];
Run Code Online (Sandbox Code Playgroud)
这样,你从数组中获取第一个Event对象,然后获取它的imgPng
属性(NSData的一个实例,这就是你想要的).
作为旁注,您在上面dataBytes
使用alloc
- 的声明init
可能是无关紧要的,因为您dataBytes
之后立即更改为您的活动中的数据.
我使用的解决方案是创建下面的类别.您只需在项目中使用它即可.使用此存储图像就像存储NSData一样
的UIImage + NSCoding.h
@interface UIImage (UIImage_NSCoding) <NSCoding>
- (void)encodeWithCoder:(NSCoder *)aCoder;
- (id)initWithCoder:(NSCoder *)aDecoder;
@end
Run Code Online (Sandbox Code Playgroud)
的UIImage + NSCoding.m
#import "UIImage+NSCoding.h"
@implementation UIImage (UIImage_NSCoding)
- (void)encodeWithCoder:(NSCoder *)aCoder
{
NSData *imageData = UIImagePNGRepresentation(self);
[aCoder encodeDataObject:imageData];
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
[self autorelease];
NSData* imageData = [aDecoder decodeDataObject];
self = [[UIImage alloc] initWithData:imageData];
return self;
}
@end
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
42434 次 |
最近记录: |