Ich bin neu in iOS. Ich habe versucht, eine Anwendung zu erstellen, in der ein von der Kamera aufgenommenes Bild gespeichert wird CoreData
. Ich weiß jetzt, wie man Daten wie NSString
s NSDate
und andere Typen speichert, habe aber Schwierigkeiten, ein Bild zu speichern. Ich habe so viele Artikel gelesen, dass Sie es auf die Festplatte schreiben und in eine Datei schreiben müssen, aber ich kann es anscheinend nicht verstehen.
Der folgende Code ist der, mit dem ich andere Daten in Kerndaten gespeichert habe.
- (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];
}
ios
objective-c
core-data
Sipho Koza
quelle
quelle
UIImage
Objekt gespeichert . Wenn ja, können Sie es folgendermaßen in einNSData
Objekt konvertieren :NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(myUIImage)];
Ich glaube, das Speichern vonNSData
ObjektenCoreData
ist nicht wirklich schwierig.UIImagePNGRepresentaion
oder UIImageJPEGrepresentation abrufen und die Daten speichern. Wenn Sie die Daten abrufen, erstellen Sie das Bild mit+imageWithData:
. Natürlich können Sie sie in Dateien speichern und einfach den Dateinamen speichern. Ich habe beides gemacht. Geben Sie mir eine Minute und ich werde nach Code-Sniplets suchen.Antworten:
Sie können Bilder in Core Data mithilfe des Attributtyps Binärdaten speichern. Sie sollten sich jedoch einiger Dinge bewusst sein:
Konvertieren Sie Ihr UIImage immer in ein tragbares Datenformat wie png oder jpg. Zum Beispiel:
NSData *imageData = UIImagePNGRepresentation(image);
Aktivieren Sie "Ermöglicht externen Speicher" für dieses Attribut. Core Data verschiebt die Daten in eine externe Datei, wenn sie einen bestimmten Schwellenwert erreichen. Diese Datei wird auch vollständig von Core Data verwaltet, sodass Sie sich darüber keine Sorgen machen müssen.
Wenn Sie auf Leistungsprobleme stoßen, versuchen Sie, das Attribut Binärdaten in eine separate Entität zu verschieben.
Sie sollten die Konvertierung in NSData hinter der Schnittstelle Ihrer NSManagedObject-Unterklasse abstrahieren, damit Sie sich nicht um Konvertierungen von UIImage nach NSData oder umgekehrt kümmern müssen.
Wenn Ihre Bilder nicht stark mit den Entitäten in Ihrem Modell verbunden sind, würde ich empfehlen, sie außerhalb von Core Data zu speichern.
quelle
In der Unterklasse xcdatamodelId deklarieren
NSData
Sie die Bildentität als ... Sie können dasUIImage
Format nicht verwenden , da die Bilddaten im Binärformat vorliegen.@property (nonatomic, retain) NSData *imag;
In der Implementierungsdatei .. konvertieren
UIImage
nachNSData
UIImage *sampleimage = [UIImage imageNamed:@"sampleImage.jpg"]; NSData *dataImage = UIImageJPEGRepresentation(sampleimage, 0.0);
Dann speichere es endlich
[obj setValue:dataImage forKey:@"imageEntity"]; // obj refers to NSManagedObject
quelle
Für Swift 5 und Swift 4.2
konvertieren
UIImage
zuData
:let imageData = image.jpegData(compressionQuality: 1.0)
Speichern unter
CoreData
:let object = MyEntity(context: managedContext) //create object of type MyEntity object.image = imageData //add image to object do { try managedContext.save() //save object to CoreData } catch let error as NSError { print("\(error), \(error.userInfo)") }
quelle
- (void)imageChanged:(UIImage*)image{ if (self.detailItem) { [self.detailItem setValue:UIImagePNGRepresentation(image) forKey:kSignatureImage]; } }
In diesem ein sehr kurzes Beispiel.
self
ist ein Ansichts-Controller, der Kerndaten verwendet, und self.detailItem ist das übliche NSManagedObject. In diesem Projekt habe ich keine Modellklassen für die Entitäten erstellt, sondern ausschließlich das KVC-Muster verwendet, um auf die Attribute zuzugreifen. Wie Sie sich vorstellen können, heißt das Attribut,"signatureImage"
das ich in einer # define-Konstante definiert habekSignatureImage
.Hier wird das Image aus den Kerndaten wiederhergestellt:
self.signatureCanvas.image = [UIImage imageWithData:[self.detailItem valueForKey:kSignatureImage]];
Auch hier
self
handelt es sich um einen Ansichtscontroller,signatureCanvas
um eineUIImageView
Unterklasse und.image
um dessen reguläreimage
EigenschaftUIImageView
.detailItem
ist wieder das üblicheNSManagedObject
.Das Beispiel stammt aus einem Projekt, an dem ich gerade arbeite.
Es gibt Vor- und Nachteile, große Datenobjekte wie Bilder in Kerndaten zu speichern oder in Dateien zu trennen. Wenn Sie sie in Dateien speichern, sind Sie dafür verantwortlich, sie zu löschen, wenn die zugehörigen Datenobjekte gelöscht werden. Dies bietet Codierungsaufwand und kann für Programmierfehler flüchtig sein. Andererseits kann dies die zugrunde liegende Datenbank verlangsamen. Ich habe noch nicht genug Erfahrung mit diesem Ansatz, die ich in Bezug auf die Leistung teilen könnte. Am Ende ist der belegte Speicherplatz insgesamt ungefähr gleich groß.
quelle
Nur wenige Links, die Ihnen dabei helfen könnten
https://stackoverflow.com/a/3909082/558000
Speichern und Abrufen eines UIImage auf CoreData
http://ootips.org/yonat/uiimage-in-coredata/
quelle
Es ist möglich, Bilder in Core Data als UIImage zu speichern. Dies wird zwar nicht als bewährte Methode angesehen, da Datenbanken nicht zum Speichern von Dateien vorgesehen sind. Wir verwenden keine Kerndaten, um die Bilder direkt zu speichern, sondern verwenden den Dateipfad, in dem die Bilddaten auf Ihrem Telefon gespeichert sind.
Wie auch immer, die beste Methode, die ich bei der Entwicklung eines Nebenprojekts herausgefunden habe, wird unten gezeigt
Setzen Sie den Entitätscode Gen auf Manuell / Keine
Wählen Sie das Attribut aus, dessen Bildtyp Sie sein möchten, und wählen Sie als Typ transformierbar aus
Geben Sie die benutzerdefinierte Klassenkennung als UIImage ein
Gehen Sie zum Editor und wählen Sie NSManagedObject-Unterklasse erstellen
Der Prozess erstellt 2 schnelle Dateien, abhängig von der Anzahl Ihrer Entitäten (ich hatte nur 1 Entität). Wählen Sie nun die
<EntityName> + CoreDataProperties.swift
Datei aus und importieren Sie UIKitWenn Sie auf " Zur Definition springen" für die öffentliche Variable "@NSManaged" klicken, ist
UIImage definition
Ihre Arbeit erledigt.Führen Sie Aktionen für die Entitäten wie gewohnt aus, und Sie können das Bildattribut durch Downcasting abrufen, speichern und bearbeiten
<EntityName>?.value(forKey: "<attributeName>") as? UIImage
.Ich musste die Entität als
NSManagedObject
Typ verwenden und konnte aus irgendeinem Grund nicht direkt von der erstellten Unterklasse auf das Bild zugreifen.quelle
Ich weiß nicht, warum Sie Bilder in Kerndaten speichern möchten, während in iOS anderer dauerhafter Speicher verfügbar ist. Wenn Sie das Image nur für Cachezwecke speichern möchten, können Sie es im Dokumentverzeichnis oder im Cache-Verzeichnis speichern. Viel Spaß beim Codieren ...
Weitere Informationen finden Sie unter URL, Speichern und Abrufen von Bildern im Dokumentverzeichnis.
http://www.wmdeveloper.com/2010/09/save-and-load-uiimage-in-documents.htmlSpeichern des Bildes im Verzeichnis "Dokumente" und Abrufen für E-Mail-Anhänge
Wie erstelle ich eine temporäre Datei mit Cocoa?
quelle