Leggere e scrivere le immagini su uno SQLite DB per l'uso iPhone

voti
22

Ho creato un DB SQLite che attualmente legge e scrive NSStrings perfettamente. Voglio anche memorizzare un'immagine nel database e ricordo in un secondo momento. Ho letto un po 'sull'uso NSDatae la codifica l'immagine, ma non sono del tutto sicuro di quello che la sintassi è per quello che voglio fare. Eventuali frammenti di codice o esempi sarebbe molto apprezzato.

Il mio attuale processo va in questo modo: UIImagePickerController-> Sceglie utente Immagine da Foto -> chosenImage è impostato su istanza di UIImageView-> Ora voglio prendere questa immagine e conservarla nel DB

Devo dire questa chiamata sarà sostituito con una chiamata a un server remoto. Non sono sicuro se questo fa la differenza per quanto riguarda le prestazioni va.

È pubblicato 13/03/2009 alle 18:03
fonte dall'utente
In altre lingue...                            


6 risposte

voti
31

Avrete bisogno di convertire l'UIImage ospitato all'interno UIImageView in un blob binario per la conservazione in SQLite. Per fare questo, è possibile utilizzare il seguente:

NSData *dataForImage = UIImagePNGRepresentation(cachedImage);
sqlite3_bind_blob(yourSavingSQLStatement, 2, [dataForImage bytes], [dataForImage length], SQLITE_TRANSIENT);

Questo genererà una rappresentazione della vostra immagine PNG, conservarlo in un caso NSData, e quindi associare i byte dal NSData come BLOB per il secondo argomento nella query SQL. Utilizzare UIImageJPEGRepresentation in quanto sopra per memorizzare in quel formato, se volete. Avrete bisogno di avere una colonna BLOB aggiunto alla tabella appropriata nel database SQLite.

Per recuperare questa immagine, è possibile utilizzare il seguente:

NSData *dataForCachedImage = [[NSData alloc] initWithBytes:sqlite3_column_blob(yourLoadingSQLStatement, 2) length: sqlite3_column_bytes(yourLoadingSQLStatement, 2)];       
self.cachedImage = [UIImage imageWithData:dataForCachedImage];
[dataForCachedImage release];
Risposto il 13/03/2009 a 18:41
fonte dall'utente

voti
9

raccomandazione di Apple non è quello di memorizzare BLOB di in database SQLite che sono più grandi di ~ 2 kilobyte.

SQLite database organizza in pagine. Ogni pagina è di 4 kilobyte di dimensione. Quando si leggono i dati dal file di database SQLite carica queste pagine in una cache pagina interna. Su iPhone penso che questa cache di default è 1 megabyte di dimensione. Questo rende la lettura record adiacenti molto veloce perché probabilmente saranno nella cache di pagina già.

Quando SQLite legge il tuo record di database in memoria si legge l'intero record e tutte le pagine che occupa. Così, se il record contiene un BLOB, si potrebbe occupare molte pagine e sarai espulsione pagine esistenti dalla cache e la loro sostituzione con le pagine del vostro record di BLOB.

Questo non è così male se siete solo la scansione attraverso e il caricamento di tutto il tuo blob di fare qualcosa con loro (li visualizza per esempio). Ma se dire che hai fatto una query in cui si voleva solo per ottenere alcuni dati che è nella stessa fila del BLOB questa query sarebbe molto più lento se il record non conteneva la grande BLOB.

Quindi, come minimo si dovrebbe memorizzare i dati BLOB in una tabella separata. Per esempio:

CREATE TABLE blobs ( id INTEGER PRIMARY KEY, data BLOB );
CREATE TABLE photos ( id INTEGER PRIMARY KEY, name TEXT, blob_id INTEGER, 
    FOREIGN KEY(blob_id) REFERENCES blobs(id) );

O meglio ancora, memorizzare i dati BLOB come file al di fuori del database SQLite.

Si noti che può essere possibile modificare la dimensione della cache pagina con le istruzioni SQL PRAGMA (se non si utilizza CoreData).

Risposto il 15/04/2011 a 11:21
fonte dall'utente

voti
9

Una possibilità (e in genere preferito quando si lavora in SQL) è quello di scrivere l'immagine in un file sul sistema e memorizzare il percorso (o qualche altro tipo di identificatore) nel database.

Risposto il 13/03/2009 a 18:32
fonte dall'utente

voti
2

Scrittura Immagine a SQLite DB

if(myImage != nil){
    NSData *imgData = UIImagePNGRepresentation(myImage);
    sqlite3_bind_blob(update_stmtement, 6, [imgData bytes], [imgData length], NULL);    
    }
    else {
        sqlite3_bind_blob(update_stmtement, 6, nil, -1, NULL);
    }

Lettura Da SQLite DB:

NSData *data = [[NSData alloc] initWithBytes:sqlite3_column_blob(init_statement, 6) length:sqlite3_column_bytes(init_statement, 6)];
        if(data == nil)
            NSLog(@"No image found.");
        else
            self.pictureImage = [UIImage imageWithData:data];   
Risposto il 29/01/2010 a 14:05
fonte dall'utente

voti
0

si dovrebbe scrivere prima immagine sul file system. e poi prendere il percorso dell'immagine e memorizzare quel percorso di immagini (URL) come testo SQLite.

Risposto il 27/05/2015 a 07:08
fonte dall'utente

voti
0

La pratica migliore è quella di comprimere l'immagine e conservarla nel sistema di database o file. Se non vi interessa circa la risoluzione dell'immagine si può andare avanti e anche ridimensionare l'immagine utilizzando:

   UIGraphicsBeginImageContext(newSize);  
   [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];   
   UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();    
   UIGraphicsEndImageContext();

Dopo di che è possibile utilizzare UIImageJPEGRepresentationper le immagini JPEG con un valore pari a "0" per la massima compressione. Oppure si può utilizzare UIImagePNGRepresentationper le immagini png

Risposto il 05/07/2012 a 13:21
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more