2012-10-05 62 views
0

我已經創建了一個sqlite數據庫。UIImage對象令人驚訝地返回null但不是NSData

和我在我的分貝插入幾個DATAS ..

UIImage * imagee=[UIImage imageNamed:@"image.png"]; 
NSData *mydata=[NSData dataWithData:UIImagePNGRepresentation(imagee)]; 
const char *dbpath = [databasePath UTF8String]; 

NSString *insertSQL=[NSString stringWithFormat:@"insert into CONTACTS values(\"%@\",\"%@\")",@"Mathan",mydata]; 

NSLog(@"mydata %@",mydata); 

sqlite3_stmt *addStatement; 

const char *insert_stmt=[insertSQL UTF8String]; 
if (sqlite3_open(dbpath,&contactDB)==SQLITE_OK) { 
    sqlite3_prepare_v2(contactDB,insert_stmt,-1,&addStatement,NULL); 

    if (sqlite3_step(addStatement)==SQLITE_DONE) { 

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

    } 
    else{ 

     NSLog(@"Some Error occured"); 
    } 

    sqlite3_close(contactDB); 
} 
else{ 
    NSLog(@"Failure"); 
} 

已經寫了一些代碼以檢索數據

sqlite3_stmt *statement; 
if (sqlite3_open([databasePath UTF8String], &contactDB) == SQLITE_OK) { 
    NSString *sql = [NSString stringWithFormat:@"SELECT * FROM contacts"]; 

    if (sqlite3_prepare_v2(contactDB, [sql UTF8String], -1, &statement, nil) == SQLITE_OK) { 
     while (sqlite3_step(statement) == SQLITE_ROW) 
     { 
      char *field1 = (char *) sqlite3_column_text(statement, 0); 
      NSString *field1Str = [[NSString alloc] initWithUTF8String: field1]; 
      NSLog(@"UserName %@",field1Str); 

      NSData *data = [[NSData alloc] initWithBytes:sqlite3_column_blob(statement, 1) length:sqlite3_column_bytes(statement, 1)]; 

      UIImage *newImage = [[UIImage alloc]initWithData:data]; 

      NSLog(@"Image OBJ %@",newImage); 
      NSLog(@"Image Data %@",data); 
     } 
     sqlite3_close(contactDB); 
    } 
} 

sqlite3_finalize(statement); 

問題是

日誌

,插入NSData對象和檢索NSData對象是不同的(打印在日誌中給出不同的流)

此外Image OBJ在日誌中打印爲空。

在stackoverflow中看到過類似的問題。但似乎沒有任何幫助。

+0

你是怎麼解決這個問題呢? – MBH

回答

0

當你這樣做:

NSData *data = [[NSData alloc] initWithBytes:sqlite3_column_blob(statement, 1) length:sqlite3_column_bytes(statement, 1)]; 
UIImage *newImage = [[UIImage alloc]initWithData:data]; 

你告訴編譯器,這兩個對象是不同的,所以當你打印出來,他們將永遠是不同的。保證。因爲它們不是同一個對象。

我不確定爲什麼newImage會顯示爲null,因爲您剛剛分配了對象。

+0

我想他是說插入過程中'NSData'對象的內容與從db中檢索到的相應'NSData'的內容不匹配(不是UIImage和NSData不匹配)。我明白你爲什麼跳到這個結論(他把'UIImage'和'NSData'的'NSLog'緊靠在一起),但他大概把'NSData'日誌輸出與'NSLog'的'NSLog'比較, NSData'在前面的代碼片段中。 – Rob

+0

啊,現在更有意義了 – mprivat

0

您應該執行sqlite3_stepsqlite3_bind_blob,而不是之前。在你告訴它插入什麼之前插入!

檢查結果sqlite_prepare_v2sqlite3_bind_blob也是謹慎的。

我也建議(與你的問題無關)sqlite3_finalize之前你sqlite3_close在這兩個代碼段。如果你有一個錯誤,sqlite3_errmsg是一個生活救星,告訴你究竟出了什麼問題,而不是猜測。

0

沒有一個大的差異,但你可以用這個嘗試,你也可以得到像長在控制檯能檢測到圖像正確地從數據庫或沒有響應:

const void *ptr = sqlite3_column_blob(stmt, 1); 
int size = sqlite3_column_bytes(stmt, 1); 
NSLog(@"%d",size); 
data = [[NSData alloc] initWithBytes:ptr length:size];