Come memorizzare e visualizzare le immagini in iPhone Core Data | iOS | iPad | UIImage


Informazioni di base è il mezzo principale per l'archiviazione dei dati persistenti su un iPhone, iPad o iPod Touch. Core Data è un ER (Entity-Relationship), un ORM (Object Relational Mapping) strumento strumento e un wrapper per impianto di stoccaggio SQLite tutto in uno. Informazioni di base Entity usato per rappresentare tabelle SQLite e attributi per rappresentare le colonne. È possibile utilizzare predicati per creare query e costruire relazioni tra entità che utilizzano relazioni.

Questo tutorial è basato sul primo tutorial: iOS 5 | iPhone | Tutorial sullo sviluppo di applicazioni di dati di base per i principianti di creare un'applicazione che memorizza le immagini JPEG presenti sulle risorse e li memorizza nel Nucleo I dati per la visualizzazione in un UITableView. L'applicazione mostrerà anche come recuperare i dati memorizzati e visualizzare l'immagine, il percorso e il nome del file nel controller vista di dettaglio.




Ecco alcuni screenshot dell'applicazione completato:

Descrizione e impostazioni di progetto


La domanda deve essere costruito per questo tutorial eseguire la scansione della directory delle risorse all'avvio (questo non è il modo migliore per un'applicazione di produzione, serve anche lo scopo di semplicità e di dimostrazione) e memorizzare il nome di ogni file, il percorso completo del file di immagine e, in particolare, l'applicazione memorizza la rappresentazione binaria di ogni file jpg nella memoria permanente di CoreData (ad esempio SQLite). L'applicazione visualizza il nome di ogni file sul UITableView e consentire all'utente di eliminare i file di dati di base. Infine, il nome del file, il percorso, e l'immagine possono essere recuperati Core Data se visualizzato su un controller di vista di dettaglio in base alla selezione dell'utente.

Per questo tutorial il miglior modello da utilizzare è il master-detail iPhone, offrendo la possibilità di aggiungere capacità di elaborare il modello Core Data. Questo è importante perché il personale tutto ha bisogno di avviare codice aggiungere. Assicurarsi di selezionare l'iPhone come dispositivo di destinazione e selezionare Informazioni di base.

modello di dati di configurazione


Dopo aver creato il progetto, selezionare il file xcdatamodeld. Questo è il file modello di dati, in cui si definiscono le entità, attributi, relazioni e predicato della query memorizzati nel database SQLite. Per impostazione predefinita, il modello aggiunge un evento di entità e gli attributi timestamp. È possibile eliminare o rinominare queste immagini e rinominare il timestamp IMG evento modificare il tipo di dati binari. Anche aggiungere un attributo nome di un tipo di stringa, e, infine, un URLPath attribuire a un tipo di stringa.

Per questo tutorial, non abbiamo bisogno di alcuna relazione o predicati. Il modello di dati dovrebbe essere simile al seguente finestra di Figura 3.

aggiungere immagini


Per il bene di questo tutorial, ho optato per l'aggiunta di cinque immagini jpg, ma è possibile scegliere il proprio. Se si desidera, è possibile creare un nuovo gruppo, denominato le immagini per memorizzare i file di immagine, oppure è possibile copiare i file direttamente nelle risorse del progetto. Copiare questi nel progetto tramite il menu contestuale facendo clic destro la radice progetto e selezionare "Aggiungi file .... progetto."

Impostazioni dal controller principale Vista - fetchedResultsController


Potete dare un'occhiata ai file AppDelegate ma non cambia nulla, in quanto il modello fornito tutto il necessario per creare il NSManagedObjectContext, NSManagedObjectModel e NSPersistentStoreCoordinator per voi codice.

La maggior parte dei cambiamenti che dobbiamo fare è presentare MasterViewController. In primo luogo aprire il file di intestazione e aggiungere due metodi: getPath e getImageBinary. Il primo sarà catturare il percorso completo di ogni file immagine e la seconda otterrà la rappresentazione binaria di ogni file immagine come tipo NSData.

MasterViewController - Header Modifiche

- (Vuoto) insertNewObject: (NSString *) filename; - (NSString *) getPath: (NSString *) filename; - (NSData *) getImageBinary: (NSString *) filename;

insertNewObject è stato fornito dal modello, ma per questo tutorial, cambiare il tipo di parametro di NSString * id e nome del parametro nome del file. Il metodo getPath ottenere il percorso completo in cui si trovano i file. Questi valori saranno memorizzati in URLPath in CoreData. Successivamente, il getImageBinary ottenere la rappresentazione binaria di ogni file di immagine e la restituisce come oggetto da memorizzare in NSData CoreData come dati binari.

Nel file di implementazione, modificare i riferimenti entità "evento" 'per "Immagini" nel metodo di fetchedResultsController anche cambiare il tipo descrittore di "timestamp" per il "nome". Il corpo del metodo per fetchedResultsController il codice elencato di seguito dovrebbe apparire.

Master View Controller - fetchedResultsController

- (NSFetchedResultsController *) fetchedResultsController { if (__fetchedResultsController! = nil) { __fetchedResultsController ritorno; } NSFetchRequest fetchRequest * = [[NSFetchRequest alloc] init]; // Cambiare il nome del soggetto, a seconda dei casi. NSEntityDescription * entità = [NSEntityDescription entityForName: @ "Immagini" inManagedObjectContext: self.managedObjectContext]; [FetchRequest setEntity: entità]; // Imposta la dimensione del lotto a un numero ragionevole. [FetchRequest setFetchBatchSize: 20]; // Modificare la chiave di ordinamento come appropriato. NSSortDescriptor SortDescriptor * = [[NSSortDescriptor alloc] initWithKey: @ a monte "name": NO]; NSArray * sortDescriptors = [arrayWithObjects NSArray: SortDescriptor, nil]; [SetSortDescriptors fetchRequest: sortDescriptors]; // Modificare il nome in codice della sezione di percorso e il nome della cache, se presente. // Zero per il nome della sezione percorso della chiave significa "no sezioni". NSFetchedResultsController * aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest: fetchRequest managedObjectContext: self.managedObjectContext sectionNameKeyPath: cacheName nullo: @ "Maestro"]; aFetchedResultsController.delegate = yes; self.fetchedResultsController = aFetchedResultsController; NSError * error = nil; if ([self.fetchedResultsController performFetch: & Error]) { // Sostituire questa implementazione con il codice per gestire l'errore in modo appropriato. // Annulla (), l'applicazione per generare un crash log e terminare. Si consiglia di non utilizzare questa funzione in una distribuzione di applicazioni, ma può essere utile durante lo sviluppo. NSLog (@ "Errore non risolto% @,% @", errore, [error userInfo]); abort (); } __fetchedResultsController ritorno; }

Impostazioni dal controller principale Vista - configureCell


Allo stesso modo cambiare il "valueForKey" valore "nome" nel metodo configureCell per il nome del file di ogni oggetto memorizzato appare UITableView. Il codice seguente esempio mostra come dovrebbe apparire il metodo.

Master View Controller - Codice configureCell

- (Vuoto) configureCell: Cell (UITableViewCell *) atIndexPath: (NSIndexPath *) indexPath { NSManagedObject * Object = [self.fetchedResultsController objectAtIndexPath: indexPath]; cell.textLabel.text = [[oggetto valueForKey: @ "nome"] descrizione] }

Impostazioni dal controller principale Vista - viewDidLoad


La maggior parte del lavoro nella raccolta di file di immagini e memorizzarli in Core Data saranno effettuati con il metodo viewDidLoad. Come già precisato che questo non è il modo più efficace per fare questo perché:

1- Ogni volta che si avvia il negozio di applicazioni di una nuova copia dell'immagine nel Core Data.
2- L'applicazione non verifica se il file esiste già nel database

I design mantenendo così il design stile semplice di concentrarsi sugli obiettivi reali di tutorial, che erano per mostrare come memorizzare dati binari in CoreData e anche per mostrare i dati binari di un impianto di stoccaggio CoreData.

Il metodo viewDidLoad e notevole quantità di modello di codice che possono tutti essere rimosso e sostituito con il codice seguente:

Master View Controller - viewDidLoad

- (Vuoto) viewDidLoad { [Super viewDidLoad]; self.navigationItem.leftBarButtonItem = self.editButtonItem; NSString * root = [[NSBundle mainBundle] bundlePath]; NSFileManager * filemgr = [NSFileManager defaultManager]; NSArray * dirContents = [filemgr contentsOfDirectoryAtPath: errore principale: nil]; NSPredicate * extFilter = [NSPredicate predicateWithFormat: @ "car '.jpg' EndsWith"]; OnlyJPGs NSArray * = [dirContents filteredArrayUsingPredicate: extFilter]; for (NSString * fname in onlyJPGs) { [Self insertNewObject: fname]; } }

Subito dopo il "[super viewDidLoad]" riga di codice, "self.navigationItem.leftBarButtonItem = self.editButtonItem;" dichiarazione crea un pulsante Modifica. Questo è utile per la rimozione di tutti gli elementi indesiderati dei file. Questa capacità è particolarmente importante, perché con questa applicazione una copia del nuovo elenco di file ogni volta che viene aggiunto l'applicazione viene eseguita.

Il "risultato * NSString = [[NSBundle mainBundle] bundlePath];" dichiarazione recupera un handle alla directory delle risorse.
La seguente riga di codice, "NSFileManager * filemgr = [NSFileManager defaultManager];" un file manager istanza che avremo bisogno di recuperare il contenuto della directory di risorse utilizzerà nella seguente riga di codice.

Le "NSArray * dirContents = [filemgr contentsOfDirectoryAtPath: errore principale: nil];. Istruzione usa istanza di oggetto filemgr per recuperare il contenuto della directory root utilizzando il metodo contentsOfDirectoryAtPath Questo metodo restituisce un array di tutti i nomi dei file, ma per il nostro esercizio hanno solo file jpg quindi bisogna applicare un filtro per rimuovere tutti i file indesiderati.

Le prossime due righe di codice, "NSPredicate * extFilter = [NSPredicate predicateWithFormat: @" '.jpg' auto EndsWith "]" e "NSArray * onlyJPGs = [dirContents filteredArrayUsingPredicate: extFilter]," crea un filtro utilizzando la classe allora NSPredicate questo predicato è applicato alla matrice. Per questo esempio jpg file e filtri, ma è possibile modificare questa stringa di ricerca di incontrare.

Ora ho solo bisogno di scorrere l'array e chiamo il nuovo metodo insertNewObject aggiungere i file nella memoria permanente di fatti di base passano il nome alla matrice con il metodo descritto di seguito.

cambiare il metodo insertNewObject


Questo metodo è una versione modificata dell'originale. L'unica vera differenza con l'originale è quello che io chiamo la variabile "newManagedObject" per regolare i valori degli attributi nel quadro Core Data. Il primo esempio viene aggiunto il nome del file per l'attributo "nome". La seconda chiamata aggiunge il percorso del file utilizzando il metodo getPath, che vedremo nel prossimo paragrafo. Allo stesso modo il terzo invito a "newManagedObject", ha aggiunto i dati binari nel database. La lista getImageBinary è in una sezione separata.

Codice insertNewObject

- (Vuoto) insertNewObject: (NSString *) filename { NSManagedObjectContext * context = [self.fetchedResultsController managedObjectContext]; Entità = NSEntityDescription * [entità [self.fetchedResultsController fetchRequest]]; NSManagedObject * newManagedObject = [NSEntityDescription insertNewObjectForEntityForName: [nome della società] inManagedObjectContext: contesto]; [NewManagedObject setValue: fileName Forkey: @ "nome"]; [NewManagedObject setValue: [auto getPath: Nome file] Forkey: @ "URLPath"]; [NewManagedObject setValue: [auto getImageBinary: Nome file] Forkey: @ "img"]; // Salva il contesto. NSError * error = nil; if (! [contesto salvataggio: ed errore]) { // Sostituire questa implementazione con il codice per gestire l'errore in modo appropriato. // Annulla (), l'applicazione per generare un crash log e terminare. Si consiglia di non utilizzare questa funzione in una distribuzione di applicazioni, ma può essere utile durante lo sviluppo. NSLog (@ "Errore non risolto% @,% @", errore, [error userInfo]); abort (); } }

Il metodo getPath


Il metodo crea un'istanza e l'istanza della classe con il NSURL "initFileURLWithPath", che ha un parametro di stringa per restituire il percorso completo della directory delle risorse. Dovremo aggiungere il nome del file con "stringByAppendingString" class NSString.

Per memorizzare il percorso dei dati essenziali URLPath, assegnare e restituire la variabile NSURL imageURL come NSString. Questo risultato è ottenuto attraverso la proprietà "absoluteString" class NSURL.

Il Codice getPath

- (NSString *) getPath: (NSString *) filename { NSString * root = [[NSBundle mainBundle] bundlePath]; NSURL * imageURL = [[NSURL alloc] initFileURLWithPath: [root stringByAppendingString: [@ "/" stringByAppendingString: nomefile]]]; [ImageURL absoluteURL]; NSString * path = [imageURL absoluteString]; NSLog (@ "% @", percorso); via del ritorno; }

Il Metodo getImageBinary


Il "absoluteString" funziona allo stesso modo del metodo getPath. Questo metodo utilizza il "initWithContentsOfFile" per recuperare il contenuto del file per creare un'istanza del file di immagine UIImage. Per salvare l'immagine nel Core Data, abbiamo solo bisogno di convertire UIImage variabile in un formato binario, la creazione di un NSData variabili d'istanza di classe che rappresentano i dati binari. ImgData aperte semplicemente restituire la variabile NSData e memorizzare il contenuto dell'immagine nel database.

Il Codice getImageBinary

- (NSData *) getImageBinary: (NSString *) filename { NSString * root = [[NSBundle mainBundle] bundlePath]; NSString * filePath = [[alloc] initWithString NSString: [root stringByAppendingString: [@ "/" stringByAppendingString: nomefile]]]; NSLog (@ "% @" filePath); UIImage * MR = [[UIImage alloc] initWithContentsOfFile: [root stringByAppendingString: [@ "/" stringByAppendingString: nomefile]]]; NSData * imgData = UIImageJPEGRepresentation (Img, 1.0); imgData ritorno; }

oggetti memorizzati reperimento e la visualizzazione di dati di base


per recuperare e visualizzare i dati memorizzati in una vista più dettagliata del controller selezionando un valore in UITableView, che dovrà implementare il metodo prepareForSegue. Fortunatamente per noi, questo è già stata fornita e non sono necessarie modifiche per il nostro esempio di applicazione. Tuttavia, se si modifica il seguente nello storyboard, si dovrà cambiare qui.

Il Codice prepareForSegue

- (Vuoto) prepareForSegue: (UIStoryboardSegue *) mittente come segue: (id) sender { if ([[ID continua] isEqualToString: @ "showDetail"]) { IndexPath NSIndexPath * = [self.tableView indexPathForSelectedRow]; NSManagedObject * Object = [[auto fetchedResultsController] objectAtIndexPath: indexPath]; [[DestinationViewController] setDetailItem segue: oggetto]; } }

Ai fini della presente applicazione di esempio ed essere in grado di vedere l'immagine dell'oggetto recuperato Core Data, faremo alcune modifiche al disegno della DetailViewController sulla storyboard come mostrato nella figura seguente.

Spostare il UILabel esistente all'inizio del UIView e aggiungere un libreria di oggetti UIImageView. Per aggiungere, selezionarlo e trascinarlo sulla tela. Poi aprire la prossima vicedirettore storyboard utilizzando l'icona Wizard cliccare sulla barra degli strumenti e trascinare un collegamento dal controllo UIImageView al file di intestazione e un nome nel campo "detailImage" e fare clic su Connetti a completare il collegamento. Chiudere l'editor facendo clic editor standard.

Intestazione

DetailViewController e implementazione

Dal momento che l'unico cambiamento che abbiamo fatto nel file di intestazione era attraverso script aggiungendo il link al controllo UIImageView, non è necessario effettuare ulteriori modifiche o l'aggiunta di fornire ulteriori spiegazioni.

Per l'applicazione, dobbiamo cambiare il codice un po '"nel metodo configureCell come illustrato di seguito.

In primo luogo impostare il titolo della vista più dettagliata del controller utilizzando l'attributo nome. Il detailDescriptionLabel visualizzare il percorso del file e, ultimo ma non meno importante, si farà riferimento a dati NSData assegnare al controllo UIImageView convertendo i dati grezzi per un oggetto UIImage utilizzando il metodo initWithData.

Attuazione

DetailViewController

Nel file di implementazione per modificare il metodo configureView  |. - (Vuoto) configureView { // Aggiorna l'interfaccia utente per voce di dettaglio. if (self.detailItem) { [Self setTitle: [[self.detailItem valueForKey: @ "nome"] descrizione]]; self.detailDescriptionLabel.text = [[self.detailItem valueForKey: @ "URLPath"] descrizione] self.detailImage.image = [[UIImage alloc] initWithData: [self.detailItem valueForKey: @ "img"]]; } }

In breve

Memorizzazione dati binari in banca dati è abbastanza facile una volta capito il file binario deve essere convertito in un formato binario, che è uno dei tipi di dati supportati nel database. Un altro punto di discussione è come estrarre l'identificatore di binario in formato raw oggetto dati e diventa un'immagine UIImage. Il resto è abbastanza semplice.

(0)
(0)

Commenti - 0

Non ci sono commenti

Aggiungi un commento

smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile
Caratteri rimanenti: 3000
captcha