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