Enregistrer et Récupérer d'une UIImage sur CoreData
Dans mon application, je suis en train d'enregistrer et de récupération d'une image dans la base de données. Je suis en mesure d'enregistrer une image avec succès après la convention de UIimage en NSData, Mais quand j'essaie d'obtenir une image en tant que NSData il montre la sortie comme indiqué ci-dessous,
cas 1: si vous essayez d'afficher une chaîne de caractères à partir de DB.
<Event: 0x5b5d610> (entity: Event; id: 0x5b5ce30 <x-coredata://F51BBF1D-6484-4EB6-8583-147E23D9FF7B/Event/p1> ; data: <fault>)
cas 2: Lorsque vous tentez d'afficher que les Données
[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'
Mon code,
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");
}
pour récupérer,
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'
Remarque: l'erreur ci-Dessus est à venir, quand on va exécuter NSData * dataBytes = [[tableau objectAtIndex:0] données]; ligne.
Modèle de données http://www.freeimagehosting.net/uploads/7c286931cc.png
J'ai passé beaucoup de temps avec cela. Merci de m'aider!
- Veuillez ajouter le code relatifs à la façon dont vous mettez l'image en NSData et comment vous le récupérer. Obscures les messages d'erreur ne l'aide pas beaucoup
- merci de votre réponse et je l'ai mis mon code. veuillez trouver quoi de mal que j'ai fait.
Vous devez vous connecter pour publier un commentaire.
Lorsque vous récupérez l'image, vous effectuez la demande de récupération et de stockage des résultats dans la variable
array
, sensarray
est titulaire d'un NSArray d'objets Événement. Puis, plus tard, vous attribuez:Cela signifie que
dataBytes
, qui vous avez déclaré que NSData, est maintenant une instance de l'Événement. Ensuite, lorsque vous allez pour initialiser l'image, le cadre de la mise en œuvre deimageWithData:
appelslength
sur ce qu'il s'attend à être votre NSData objet, mais est en fait un objet d'Événement, d'où le message d'erreur.Vous devez ajuster votre code à lire:
De cette façon, vous obtenez le premier Événement de l'objet hors de la matrice, de l'extraction de ses
imgPng
propriété (une instance de NSData, qui est ce que vous voulez).Comme une note de côté, votre déclaration de
dataBytes
à l'aide de laalloc
-init
sur la ligne ci-dessus peuvent être étrangers, depuis que vous avez changerdataBytes
être les données de votre Événement immédiatement après.data
, paslength
. Au moins cela signifie que nous sommes sur la bonne voie. Pouvez-vous poster le code pour votre Événement de classe (il doit avoir été généré par la Base de Données) ou une capture d'écran de votre Base de Données de modèle? Plus précisément, je suis à la recherche pour le nom de la getter pour ledata
propriété de l'Événement.data
de la propriété, utiliser leimgPng
de la propriété à partir de votre modèle. (J'ai pris en charge par toutes les données accesseurs sur NSData et n'ai pas pensé à regarder sur votresetValue:forKey:
appel dans votre premier bloc de code.) J'ai édité ma réponse pour refléter cela.Ne sais pas si vous avez obtenu ce redressa encore sorti, mais je suis capable de sauvegarder/récupérer
UIImage
des objets dans la Base de Données comme suit:À enregistrer:
et à charge:
Espère que cette aide. Je suis à l'aide d'un
UITableView
avec les Données de Base et en tirant l'image à partir de la base de données dans montableView:didSelectRowAtIndexPath:
méthode.Ici est la bonne solution qui fonctionne très bien.
1) le Stockage UIImage avec la Base de Données:
Assurez-vous que "coreDataImage" est de type
NSData
. Vous avez défini le type de "données Binaires" pour "coreDataImage" dans votre modèle.2) l'Extraction UIImage de Base de Données:
C'est tout là est à lui, fonctionne très bien.
La Solution que j'ai utilisé était de créer la catégorie ci-dessous. Vous avez juste besoin dans votre projet pour qu'il fonctionne. L'utilisation de ce stockage d'images fonctionne comme vous où stocker un NSData
UIImage+NSCoding.h
UIImage+NSCoding.m
Transformable
attribut. voir Magasin UIImage dans CoreData Sans Écrire de CodeCet exemple de code a exemple comment stocker UIImage dans la Base de Données:
https://developer.apple.com/library/ios/#samplecode/PhotoLocations/Introduction/Intro.html