Das Lesen und Bilder zu einer SQLite-DB für iPhone Anwendung zu schreiben

stimmen
22

Ich habe eine SQLite DB einrichten, die zur Zeit liest und schreibt NSStringperfekt s. Ich möchte auch ein Bild in der Datenbank speichern und sie später wieder zu verwenden . Ich habe ein bisschen über die Verwendung lesen , NSDataund kodiert das Bild, aber ich bin mir nicht ganz sicher , was die Syntax für das , was ich tun will. Jeder Code - Schnipsel oder Beispiele würden sehr geschätzt.

Mein aktueller Prozess so geht: UIImagePickerController-> User Image von Fotos wählt -> ist chosenImage auf Instanz gesetzt UIImageView-> Jetzt möchte ich dieses Bild nehmen und speichern sie in der DB

Ich sollte dieser Anruf erwähnen wird schließlich mit einem Aufruf an einen Remote-Server ersetzt werden. Nicht sicher, ob dies einen Unterschied macht, so weit wie Leistung geht.

Veröffentlicht am 13/03/2009 um 18:03
quelle vom benutzer
In anderen Sprachen...                            


6 antworten

stimmen
31

Sie müssen die UIImage in Ihrem UIImageView in ein binäres BLOB für die Speicherung in SQLite gehostet konvertieren. Um das zu tun, können Sie die folgenden Befehle verwenden:

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

Dies wird eine PNG Darstellung des Bildes, sollte sie in einer NSData Instanz erzeugt und dann den Bytes aus dem NSData als BLOB für das zweite Argument in der SQL-Abfrage binden. Verwenden Sie UIImageJPEGRepresentation in der oben in diesem Format zu speichern, wenn Sie möchten. Sie müssen eine BLOB-Spalte auf die entsprechende Tabelle in der SQLite-Datenbank hinzugefügt haben.

Um dieses Bild abzurufen, können Sie die folgenden Befehle verwenden:

NSData *dataForCachedImage = [[NSData alloc] initWithBytes:sqlite3_column_blob(yourLoadingSQLStatement, 2) length: sqlite3_column_bytes(yourLoadingSQLStatement, 2)];       
self.cachedImage = [UIImage imageWithData:dataForCachedImage];
[dataForCachedImage release];
Beantwortet am 13/03/2009 um 18:41
quelle vom benutzer

stimmen
9

Empfehlung von Apple ist nicht Blob zu speichern in SQLite-Datenbanken, die größer als ~ 2 Kilobyte sind.

SQLite organisiert Datenbanken in Seiten. Jede Seite ist 4 Kilobyte groß. Wenn Sie Daten aus der SQLite-Datenbank-Datei lesen lädt es diese Seiten in eine interne Seiten-Cache. Auf dem iPhone ich denke, das Cache standardmäßig auf 1 Megabyte groß. Das macht sehr schnell benachbarte Aufzeichnungen zu lesen, weil sie wahrscheinlich schon in den Seiten-Cache sein.

Wenn SQLite liest Ihre Datenbank-Datensatz in den Speicher liest sie den gesamten Datensatz und alle Seiten, die es einnimmt. Also, wenn Ihr Datensatz ein BLOB enthält, könnte es viele Seiten einnehmen, und Sie werden bestehende Seiten aus dem Cache werden Auswerfen und sie mit Ihrem BLOB Rekord Seiten zu ersetzen.

Das ist nicht so schlimm, wenn Sie gerade das Scannen durch und laden alle Ihre BLOBS mit ihnen etwas zu tun (sie zum Beispiel angezeigt werden). Aber wenn sagen haben Sie eine Abfrage, wo Sie wollte nur einige Daten erhalten, die in der gleichen Zeile wie die BLOB ist diese Abfrage viel langsamer als sein würde, wenn der Datensatz nicht die große BLOB enthielt.

Also auf ein Minimum sollten Sie Ihre BLOB-Daten in einer separaten Tabelle gespeichert werden. Z.B:

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

Oder noch besser, speichern Sie die BLOB-Daten als Dateien außerhalb der SQLite-Datenbank.

Beachten Sie, dass es möglich sein kann , die Seiten - Cache - Größe mit zwicken SQL PRAGMA - Anweisungen (wenn Sie nicht Coredata verwenden).

Beantwortet am 15/04/2011 um 11:21
quelle vom benutzer

stimmen
9

Eine Option (und in der Regel bevorzugt, wenn in SQL arbeitet) ist das Bild in eine Datei auf dem System zu schreiben und speichern Sie den Pfad (oder eine andere Art von Identifier) ​​in der Datenbank.

Beantwortet am 13/03/2009 um 18:32
quelle vom benutzer

stimmen
2

Bild Schreiben auf 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);
    }

Lesung aus 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];   
Beantwortet am 29/01/2010 um 14:05
quelle vom benutzer

stimmen
0

Sie sollten zuerst Bild auf Dateisystem schreiben. und dann den Bildpfad und speichern, dass der Bildpfad (URL) als Text in sqlite.

Beantwortet am 27/05/2015 um 07:08
quelle vom benutzer

stimmen
0

Die beste Vorgehensweise ist es, das Bild zu komprimieren und speichern sie in der Datenbank oder im Dateisystem. Wenn Sie nicht über die Auflösung des Bildes kümmern können Sie voran gehen und sogar die Größe des Bildes durch die Verwendung:

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

Danach können Sie verwenden UIImageJPEGRepresentationfür JPEG - Bilder mit einem Wert von „0“ für eine maximale Kompression. Oder Sie verwenden können , UIImagePNGRepresentationfür PNG - Bilder

Beantwortet am 05/07/2012 um 13:21
quelle vom benutzer

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