Lezen en schrijven van beelden naar een SQLite DB voor iPhone gebruik

stemmen
22

Ik heb het opzetten van een SQLite database die momenteel leest en schrijft NSStringis perfect. Ik wil ook een beeld in de database op te slaan en later opnieuw oproepen. Ik heb up las een beetje over het gebruik NSDataen het coderen van het beeld, maar ik ben niet helemaal zeker wat de syntax is voor wat ik wil doen. Elke code snippets of voorbeelden zouden zeer gewaardeerd worden.

Mijn huidige proces gaat als volgt: UIImagePickerController-> gebruiker kiest Afbeelding vanaf Foto's -> chosenImage is ingesteld op exemplaar van UIImageView-> Nu wil ik dit beeld te nemen en op te slaan in de DB

Ik moet zeggen deze oproep zal uiteindelijk worden vervangen door een oproep naar een externe server. Niet zeker of dit een verschil maakt voor zover de prestaties gaat.

De vraag is gesteld op 13/03/2009 om 18:03
bron van user
In andere talen...                            


6 antwoorden

stemmen
31

Je moet de UIImage gehost binnen uw UIImageView te zetten in een binaire BLOB voor opslag in SQLite. Om dat te doen, kunt u gebruikmaken van het volgende:

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

Dit zal een PNG representatie van de afbeelding te genereren, opbergen in een NSData exemplaar en binden de bytes van de NSData als BLOB het tweede argument SQL query. Gebruik UIImageJPEGRepresentation in het bovenstaande op te slaan in dat formaat, als je wilt. U moet een BLOB kolom aan de juiste tabel toegevoegd in uw SQLite database.

Als je deze afbeelding op te halen, kunt u gebruikmaken van het volgende:

NSData *dataForCachedImage = [[NSData alloc] initWithBytes:sqlite3_column_blob(yourLoadingSQLStatement, 2) length: sqlite3_column_bytes(yourLoadingSQLStatement, 2)];       
self.cachedImage = [UIImage imageWithData:dataForCachedImage];
[dataForCachedImage release];
antwoordde op 13/03/2009 om 18:41
bron van user

stemmen
9

aanbeveling van Apple is BLOB's niet op te slaan in SQLite databases die groter zijn dan ~ 2 kilobytes zijn.

SQLite organiseert databases in pagina's. Elke pagina is 4 kilobytes groot. Wanneer u gegevens uit de SQLite database bestand te lezen laadt deze pagina's in een interne pagina cache. Op de iPhone denk dat ik deze cache staat standaard op 1 megabyte groot. Dit maakt het lezen van aangrenzende platen zeer snel omdat ze waarschijnlijk zal worden in de pagina cache al.

Wanneer SQLite leest uw database record in het geheugen leest het volledige verslag en alle pagina's die het inneemt. Dus als uw record een BLOB bevat, kan het aantal pagina's in beslag nemen en u wordt het uitwerpen van bestaande pagina's uit de cache en te vervangen door pagina's van uw BLOB record.

Dit is niet zo slecht als je gewoon scannen door en het laden van al uw VLEKKEN om iets met hen (ze weer te geven bijvoorbeeld) doen. Maar als zeggen dat je deed een vraag waar je wilde alleen maar om een ​​aantal gegevens die zich in dezelfde rij als de BLOB deze vraag zou veel langzamer dan als het record niet de grote BLOB bevatte worden krijgen.

Dus op een minimum moet u uw BLOB-gegevens op te slaan in een aparte tabel. bv:

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

Of beter nog, slaan de BLOB data als bestanden buiten de SQLite database.

Merk op dat het mogelijk is om de pagina cache grootte met tweaken SQL PRAGMA statements (als je geen gebruik CoreData).

antwoordde op 15/04/2011 om 11:21
bron van user

stemmen
9

Een optie (en in het algemeen de voorkeur bij het werken in SQL) is om het beeld te schrijven naar een bestand op het systeem en opslaan van het pad (of een andere vorm van identificatie) in de database.

antwoordde op 13/03/2009 om 18:32
bron van user

stemmen
2

Het schrijven van de afbeelding om het 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);
    }

Lezen Van 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];   
antwoordde op 29/01/2010 om 14:05
bron van user

stemmen
0

moet u eerst het schrijven over bestandssysteem. en vervolgens de beeldweg en slaat die het pad (URL) als tekst in sqlite.

antwoordde op 27/05/2015 om 07:08
bron van user

stemmen
0

De best practice is om het beeld te comprimeren en op te slaan in de database of het bestandssysteem. Als u niet de zorg over de resolutie van de afbeelding kunt u doorgaan en zelfs het formaat van de afbeelding met behulp van:

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

Na die u kunt gebruiken UIImageJPEGRepresentationvoor JPEG-beelden met een waarde van "0" voor een maximale compressie. Of u kunt gebruiken UIImagePNGRepresentationvoor PNG-afbeeldingen

antwoordde op 05/07/2012 om 13:21
bron van user

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