2013-03-27 10 views
5

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); 
} 
+0

Ü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

+1

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

+0

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

Antwort

1

Der Return-Code (die SQLITE_OK nicht) zweifellos SQLITE_MISUSE zurückkehrt, was bedeutet, dass Sie versuchen, eine Datenbank zu verwenden, die Sie noch nicht geöffnet haben. Ihre createoropendb erstellt und öffnet, wenn die Datenbank nicht existiert, aber wenn sie existiert, öffnen Sie sie nicht (und selbst wenn sie existiert, schließen Sie sie, nachdem Sie sie erstellt haben).

Unterm Strich, wenn die Datenbank nicht geöffnet wird, wenn Sie sqlite3_prepare aufrufen, wird diese Funktion zurückgeben SQLITE_MISUSE, werden alle Anrufe zu sqlite3_errmsg eine irreführende Rückkehr „Out of Memory“ Textnachricht.

+1

Hallo Rob, schön, Ihre Antwort Kumpel zu sehen, habe ich ein wenig Zweifel, meine Datenbank ist erfolgreich erstellt.so wo ist mein Problem jetzt ist es versucht, in unbekannte Datenbank einzufügen. –

+1

@CodeWorrior Wenn Sie Ihr 'createoropendb' betrachten, was wird es tun, wenn die Datenbank bereits existiert? Nichts. Die Datenbank wird nicht geöffnet, wenn sie bereits existiert. Und wenn es es geschaffen hat, schließt es es auch sofort. Das ist ein Problem. Sie müssen 'sqlite3_open' ausführen.Und wenn Sie versuchen, in eine Datenbank einzufügen, ohne "sqlite3_open" auszuführen, erhalten Sie diesen kryptischen Fehler "Nicht genügend Arbeitsspeicher". – Rob

+0

HI Rob überprüfen Sie diesen bearbeiteten Code Link .. http://pastie.org/7133385. –

Verwandte Themen