UIImage对象令人惊讶地返回null而不是NSData

时间:2012-10-05 15:07:44

标签: iphone objective-c ios xcode ipad

我创建了一个sqlite db。

我在我的数据库中插入了一些数据..

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中看到过类似的问题。但似乎没有任何帮助。

3 个答案:

答案 0 :(得分: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,因为你刚刚分配了对象。

答案 1 :(得分:0)

您应该在 sqlite3_step后执行sqlite3_bind_blob ,而不是之前。你在告诉它要插入什么之前插入!

检查sqlite_prepare_v2sqlite3_bind_blob的结果也是谨慎的。

我还会在sqlite3_finalize之前的两段代码中建议(与您的问题无关)sqlite3_close。如果你有错误,sqlite3_errmsg是一个救生员,告诉你到底出了什么问题,而不是猜测。

答案 2 :(得分: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];