2012-04-17 50 views
2

代碼BLOB圖像保存圖像:要檢索的SQLite

NSData *imageData=UIImagePNGRepresentation(animalImage); 
     NSString *insertSQL=[NSString stringWithFormat:@"insert into AnimalsTable (name,propertyID,animalID,breed,mainBreed,dateofbirth,sex,notes,imageData) values(\"%@\",\"%@\",\"%@\",\"%@\",\"%@\",\"%@\",\"%@\",\"%@\",\"%@\")",nameString,propertyString,animalidString,breedString,mainBreedString,dateString,sexString,notesString,imageData]; 
    sqlite3_stmt *addStatement; 
     NSLog(@"%@",appDelegate.sqlFile); 
    const char *insert_stmt=[insertSQL UTF8String]; 
    if (sqlite3_open([appDelegate.sqlFile UTF8String],&database)==SQLITE_OK) { 
     sqlite3_prepare_v2(database,insert_stmt,-1,&addStatement,NULL); 

     if (sqlite3_step(addStatement)==SQLITE_DONE) { 

      sqlite3_bind_blob(addStatement, 1, [imageData bytes], [imageData length], SQLITE_TRANSIENT); 
      NSLog(@"Data saved"); 

     } 
     else{ 
      //NSAssert1(0, @"Error while updating. '%s'", sqlite3_errmsg(database)); 

      NSLog(@"Some Error occured"); 
    } 

    sqlite3_close(database); 

對於檢索圖像:

NSString *select_sql=[NSString stringWithFormat:@"select name,animalID,imageData from AnimalsTable where mainBreed='%@' AND breed='%@'",mainString,subString]; 
     const char *sql = [select_sql UTF8String]; 
     sqlite3_stmt *selectstmt; 
     if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) { 

      while(sqlite3_step(selectstmt) == SQLITE_ROW) { 

      NSString *animalName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 0)]; 
      NSString *animalid=[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 1)]; 
      NSData *dataForCachedImage = [[NSData alloc] initWithBytes:sqlite3_column_blob(selectstmt, 2) length: sqlite3_column_bytes(selectstmt, 2)];   
      [animalNamesArray addObject:animalName]; 
      [animalIDArray addObject:animalid]; 
      [imageDataArray addObject:dataForCachedImage]; 

     } 
    } 
} 
else 
    sqlite3_close(database); 

在UITableView的CellForIndexPath:

NSData *dataForCachedImage=[imageDataArray objectAtIndex:indexPath.row]; 
    UIImage *dataImage=[[UIImage alloc] init]; 
    dataImage=[UIImage imageWithData:dataForCachedImage]; 
    cell.imageView.image=dataImage; 

當我調試的代碼:

我得到字節對於NSData = 226381字節和對於dataImage 0x0。

請幫幫我。

+1

要開始,你需要正確[使用'?'](http://www.sqlite.org/c3ref/bind_blob.html)綁定你的值。嘗試使用'%@'替換值與其他任何關係數據庫一樣[危險](http://en.wikipedia.org/wiki/SQL_injection)。 – Joe 2012-04-17 14:41:27

+0

除了使用%@而不使用?之外,還可以告訴我上面的代碼有什麼問題嗎? – anjum 2012-04-17 15:39:46

回答

4

您需要將您的值正確綁定到查詢才能正常工作。當您在第一行設置查詢時,將插入數據的描述,而不是正確的數據。如果您要記錄查詢,您可能會看到類似<0FFAEC32 ... 23F0E8D1>的內容。 然後您試圖稍後正確地綁定blob,但由於您的查詢寫入不正確,所以它沒有任何效果。

//Although you try to bind a blob here it does not get bound 
//to anything since you do not include a parameter template. 
sqlite3_bind_blob(addStatement, 1, [imageData bytes], [imageData length], SQLITE_TRANSIENT); 

要在這裏解決,這是一個小例子:

//query does not need to be an NSString* but just a const char * 
//replace all %@ with ? 
const char *sql = "INSERT INTO AnimalsTable(name, ..., imageData) values(?, ..., ?)"; 
if (sqlite3_open([appDelegate.sqlFile UTF8String],&database)==SQLITE_OK) { 
     sqlite3_prepare_v2(database,insert_stmt,-1,&addStatement,NULL); 

     //Bind all of the values here before you execute the statement 
     sqlite3_bind_text(addStatement, 1, [nameString UTF8String], -1, NULL); 
     ... 
     sqlite3_bind_blob(addStatement, 9, [imageData bytes], [imageData length], SQLITE_TRANSIENT); 

     if (sqlite3_step(addStatement)==SQLITE_DONE) { 
      NSLog(@"Data saved"); 
     } 
     ... 

     //You must finalize your statement before closing the database 
     sqlite3_finalize(addStatement); 
     sqlite3_close(database); 

使用綁定值有助於防止插入這可能是一個SQL注入攻擊,並提高對於經常運行的查詢的查詢性能數據無效。

注意*:如果你要做大量的SQL考慮使用FMDB甚至核心數據。

+0

我也類似地提出了你所提到的,但是當我在sql manager中檢查它時,數據是用空值保存的。 – anjum 2012-04-18 08:26:44

+0

我已經改變了sqlite3_bind_text(addStatement,1,[nameString UTF8String],-1,NULL);到SQLITE_TRANSIENT。現在數據正常保存。但是原始問題仍然存在。 – anjum 2012-04-18 08:33:19

+0

我用過嗎?標記在我的整個查詢中,也改變了位置。 – anjum 2012-04-18 12:23:44