2013-03-27 19 views
5

im Lavorare sull'inserimento IMAGE per database SQLite utilizzando in Xcode 4.6, volevo solo inserire un campo di testo e UIImageView (avendo immagine del codice a barre generati dinamicamente) .Inserimento a database utilizzando SQLite in xcode4.6

purtroppo im ottenere "L'errore è: out of memory"

sentire è il codice che sto utilizzando, plz fatemi sapere dove il mio errore è & Fammi sapere per maggiori dettagli

* 1. creazione di database *

-(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 tonnellata per inserire i dati *

- (IBAction)savedata:(id)sender { 
    UIImage *image =imageView.image; 
    NSData *imageData=UIImagePNGRepresentation(image); 
    [self SaveImagesToSql: imageData.bytes:Uimagetext.text]; 
} 

* 3.method per inserire i dati *

- (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

A proposito, mentre spero di aver risposto alla tua domanda di seguito, ma due osservazioni non correlate: 1. Devo sottolineare che la memorizzazione delle immagini nel database non sempre funziona molto bene. Se hai a che fare con immagini di grandi dimensioni, otterrai spesso prestazioni molto migliori memorizzando l'immagine nella cartella 'Documenti' del file system e salvando solo il nome file nel database. Se hai a che fare con le anteprime, la differenza è modesta, ma con immagini grandi, il risultato della performance è osservabile. – Rob

+1

2. Non so dove si stanno ottenendo le immagini (dalla rete?) Ma non è garantito il recupero delle immagini tramite 'UIImagePNGRepresentation' per ottenere lo stesso file recuperato in origine quando si è ottenuta l'immagine. Potresti voler salvare l'immagine mentre stai aggiornando 'UIImageView', non recuperare più il' UIImage' e convertirlo in un 'NSData' con' UIImagePNGRepresentation'. Il PNG è meno problematico di JPG, ma non è ancora perfetto. Salvare i dati originali e ignorare il round-trip nella proprietà 'UIImage', se possibile. – Rob

+0

3. Si dovrebbe anche controllare i risultati di 'sqlite3_step' (nel caso in cui l'inserimento non sia riuscito). Probabilmente anche le affermazioni 'sqlite3_bind _...', anche se non le ho mai fallite. – Rob

risposta

1

Il codice di ritorno (che non è SQLITE_OK) è senza dubbio tornando SQLITE_MISUSE, il che significa che si sta cercando utilizzare un database che non hai ancora aperto. Il tuo createoropendb sta creando e aprendo se il database non esiste, ma se esiste, non lo stai aprendo (e anche se esistesse, lo stai chiudendo dopo averlo creato).

Linea di fondo, se il database non viene aperto quando si chiama sqlite3_prepare, che la funzione restituirà SQLITE_MISUSE, eventuali chiamate a sqlite3_errmsg restituirà un fuorviante "Memoria insufficiente" messaggio di testo.

+1

Ciao Rob, è bello vedere la tua risposta amico, ho un piccolo dubbio, il mio database è stato creato con successo.so dove è il mio problema ora sta cercando di inserire nel database sconosciuto. –

+1

@CodeWorrior Se guardi il tuo 'createoropendb', cosa farà se il database esiste già? Niente. Non apre il database se già esiste. E se lo ha creato, lo sta chiudendo immediatamente anche lui. Questo é un problema. Devi fare 'sqlite3_open'.E se provi a inserirli in un database senza eseguire 'sqlite3_open', otterrai quell'errore criptico di" Memoria insufficiente ". – Rob

+0

HI Rob controlla questo collegamento al codice modificato .. http://pastie.org/7133385. –

Problemi correlati