im mit Arbeit zum Einfügen von IMAGE in zur Datenbank mit SQLite in Xcode 4.6, ich wollte nur ein Textfeld und UIImageView (mit dynamisch generierten Barcode-Bild) einfügen .Bild einfügen, um Datenbank SQLite in xcode4.6
leider im immer "Fehler ist: out of memory"
hören ist der Code ich verwende, mich plz informieren, wo mein Fehler ist & mich für weitere Details kennen Lassen
* 1. Erstellung der Datenbank *
-(void)createoropendb {
NSArray *path =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docpath =[path objectAtIndex:0];
dbpathstring =[docpath stringByAppendingPathComponent:@"DataBase.db"];
char *error;
NSFileManager *filemanager =[NSFileManager defaultManager];
if (![filemanager fileExistsAtPath:dbpathstring])
{
const char *dbpath =[dbpathstring UTF8String];
if (sqlite3_open(dbpath, &barcodeDB) == SQLITE_OK)
{
const char *sql_start ="CREATE TABLE IF NOT EXISTS DBTABLE1(NAME TEXT UNIQUE,IMAGEURL BLOB)";
NSLog(@"db created");
sqlite3_exec(barcodeDB, sql_start,NULL,NULL, &error);
sqlite3_close(barcodeDB);
}
}
}
* 2.But Tonne zum Einfügen von Daten *
- (IBAction)savedata:(id)sender {
UIImage *image =imageView.image;
NSData *imageData=UIImagePNGRepresentation(image);
[self SaveImagesToSql: imageData.bytes:Uimagetext.text];
}
* 3.Verfahren zum Einfügen von Daten *
- (void) SaveImagesToSql: (NSData*) imgData :(NSString*) mainUrl {
const char* sqliteQuery = "INSERT INTO DBTABLE1(NAME,IMAGEURL) VALUES (?, ?)";
sqlite3_stmt* statement;
if(sqlite3_prepare_v2(barcodeDB, sqliteQuery, -1, &statement, NULL) == SQLITE_OK)
{
sqlite3_bind_text(statement, 1,[mainUrl UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_blob(statement, 2,[imgData bytes],[imgData length], SQLITE_TRANSIENT);
sqlite3_step(statement);
NSLog(@"Saved image successfully");
}
else
{
NSLog(@"SaveBody: Failed from sqlite3_prepare_v2. Error is: %s",sqlite3_errmsg(barcodeDB));
}
// Finalize and close database.
sqlite3_finalize(statement);
}
Übrigens, während ich hoffe, beantwortete ich Ihre Frage unten, aber zwei unabhängige Beobachtungen: 1. Ich sollte darauf hinweisen, dass das Speichern von Bildern in der Datenbank nicht immer sehr gut funktioniert. Wenn Sie mit großen Bildern arbeiten, erhalten Sie oft eine viel bessere Leistung, wenn Sie das Bild im Ordner "Dokumente" des Dateisystems speichern und nur den Dateinamen in der Datenbank speichern. Wenn Sie mit Thumbnails arbeiten, ist der Unterschied bescheiden, aber bei großen Bildern ist der Performance-Hit zu beobachten. – Rob
2. Ich weiß nicht, woher Sie die Bilder bekommen (aus dem Netzwerk?), Aber das Abrufen der Bilder über 'UIImagePNGRepresentation' garantiert nicht, dass Sie dieselbe Datei erhalten, die Sie ursprünglich beim Abrufen des Bildes erhalten haben. Vielleicht möchten Sie das Bild speichern, während Sie das 'UIImageView' aktualisieren, das' UIImage' später nicht abrufen und es mit 'UIImagePNGRepresentation' zurück in ein' NSData' konvertieren. PNG ist weniger problematisch als JPG, aber es ist immer noch nicht perfekt. Speichern Sie die Originaldaten und umgehen Sie den Hin- und Rückweg zur "UIImage" -Eigenschaft, wenn Sie können. – Rob
3. Sie sollten auch die Ergebnisse von 'sqlite3_step' überprüfen (falls die Einfügung fehlgeschlagen ist). Vermutlich auch "sqlite3_bind _..." Aussagen, obwohl ich sie nie bei mir versagt habe. – Rob