2012-10-05 42 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];