Citirea și scrierea de imagini la un SQLite DB pentru utilizarea iPhone

voturi
22

Am înființat un DB SQLite care citește în prezent și scrie NSStringe perfect. De asemenea , doresc să stocheze o imagine în baza de date și amintesc mai târziu. Am citit un pic cu privire la utilizarea NSDatași codificarea imaginii, dar nu sunt în totalitate sigur ce sintaxa este pentru ceea ce vreau să fac. Orice fragmente de cod de sau exemple ar fi apreciat foarte mult.

Procesul meu curent merge astfel: UIImagePickerController-> Imagine de la utilizator alege fotografii -> chosenImage este setat la instanță UIImageView-> Acum vreau să iau această imagine și păstrați - l în PB

Ar trebui să menționez acest apel va fi în cele din urmă înlocuit cu un apel la un server de la distanță. Nu sunt sigur dacă acest lucru face o diferență în ceea ce privește performanța merge.

Întrebat 13/03/2009 la 18:03
sursa de către utilizator
În alte limbi...                            


6 răspunsuri

voturi
31

Veți avea nevoie pentru a converti UIImage găzduit în cadrul UIImageView într-un BLOB binar pentru depozitare în SQLite. Pentru a face acest lucru, puteți utiliza următoarele:

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

Acest lucru va genera o reprezentare PNG a imaginii, păstrați-l într-o instanță NSData, și apoi lega octeți de la NSData ca o pată de cerneală pentru al doilea argument în interogarea SQL. Utilizați UIImageJPEGRepresentation în cele de mai sus pentru a stoca în acel format, dacă doriți. Va trebui să aibă o coloană BLOB adăugată la tabelul corespunzător în baza de date SQLite.

Pentru a prelua această imagine, puteți utiliza următoarele:

NSData *dataForCachedImage = [[NSData alloc] initWithBytes:sqlite3_column_blob(yourLoadingSQLStatement, 2) length: sqlite3_column_bytes(yourLoadingSQLStatement, 2)];       
self.cachedImage = [UIImage imageWithData:dataForCachedImage];
[dataForCachedImage release];
Publicat 13/03/2009 la 18:41
sursa de către utilizator

voturi
9

Recomandarea Apple nu este de a stoca lui BLOB în baze de date SQLite, care sunt mai mari decât ~ 2 kilobytes.

SQLite organizează baze de date în pagini. Fiecare pagină este de 4 kilobytes în dimensiune. Când citiți datele din fișierul SQLite baza de date se încarcă aceste pagini într-o memorie cache pagină internă. Pe iPhone cred că această memorie cache implicit la 1 MO. Acest lucru face ca citirea înregistrărilor adiacente foarte repede, deoarece acestea vor fi, probabil, în cache-ul paginii deja.

Când SQLite citește înregistrarea bazei de date în memorie citește întreaga înregistrare și toate paginile pe care le ocupă. Deci, în cazul în care dosarul dumneavoastră conține o pată de cerneală, s-ar putea ocupa mai multe pagini și veți fi ejectarea paginile existente din cache-ul și înlocuirea lor cu paginile de înregistrare dvs. BLOB lui.

Acest lucru nu este atât de rău, dacă sunteți doar scanarea și încărcarea tuturor blobs de a face ceva cu ei (a le afișa, de exemplu). Dar dacă spune că a făcut o interogare în cazul în care ai vrut doar pentru a obține unele date care este în același rând BLOB această interogare ar fi mult mai lent decât în ​​cazul în care înregistrarea nu conține BLOB mare.

Deci, la un nivel minim ar trebui să stocați datele BLOB într-un tabel separat. De exemplu:

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) );

Sau mai bine, stoca datele BLOB ca fișiere în afara bazei de date SQLite.

Rețineți că poate fi posibil pentru a optimiza dimensiunea paginii cache cu instrucțiuni SQL Pragma (dacă nu utilizați CoreData).

Publicat 15/04/2011 la 11:21
sursa de către utilizator

voturi
9

O opțiune (și, în general, de preferat atunci când se lucrează în SQL) este de a scrie imaginea într-un fișier de pe sistem și a stoca calea (sau un alt tip de identificator) în baza de date.

Publicat 13/03/2009 la 18:32
sursa de către utilizator

voturi
2

Scrierea imagine pentru 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);
    }

Citirea De la 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];   
Publicat 29/01/2010 la 14:05
sursa de către utilizator

voturi
0

ar trebui să scrie prima imagine de pe sistemul de fișiere. și apoi să ia calea de imagine și stoca această cale a imaginii (URL) TEXT în SQLite.

Publicat 27/05/2015 la 07:08
sursa de către utilizator

voturi
0

Cea mai bună practică este de a comprima imaginea și păstrați-l în sistemul de baze de date sau un fișier. Dacă nu vă pasă de rezoluția imaginii pe care se poate merge mai departe și chiar redimensiona imaginea folosind:

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

După care le puteți utiliza UIImageJPEGRepresentationpentru imagini jpeg , cu o valoare de „0“ pentru compresie maximă. Sau puteți utiliza UIImagePNGRepresentationpentru imagini png

Publicat 05/07/2012 la 13:21
sursa de către utilizator

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