Iphone sqlite3 blob问题

Iphone sqlite3 blob问题,iphone,sqlite,blob,Iphone,Sqlite,Blob,可能重复: 我尝试将BLOB数据读写到数据库中。但是当我尝试读取blob数据时,它的大小是0。我所有的字段数据都被移动了。代码如下: 请帮帮我,我做错了什么??塔克斯 -(int) addUser: (MyData *) user table: (NSString *) tableName { } 在这里,我如何读取这些字段: -(MyData *) createUserWithDetailsByID: (int) uID { NSString *query = [NSString

可能重复:

我尝试将BLOB数据读写到数据库中。但是当我尝试读取blob数据时,它的大小是0。我所有的字段数据都被移动了。代码如下:

请帮帮我,我做错了什么??塔克斯

-(int) addUser: (MyData *) user table: (NSString *) tableName
{

}

在这里,我如何读取这些字段:

-(MyData *) createUserWithDetailsByID: (int) uID
{
    NSString *query = [NSString stringWithFormat: @SELECT_USER_ALLDATA_BY_ID, uID];
    MyData *user = nil;

    sqlite3_stmt *statement;
    int res = SQLITE_ERROR;
    res = sqlite3_prepare_v2 (database, [query UTF8String], -1, &statement, nil);

    if (res == SQLITE_OK)
    {
        if (sqlite3_step(statement) == SQLITE_ROW)
        {
            //if there are results in row
            char *buf = NULL;
            user = [[MyData alloc] init];

            int num = sqlite3_column_int(statement, 0);
            user.uID = num;

            buf = (char *)sqlite3_column_text(statement, 1);
            if (buf)
                user.name = [NSString stringWithFormat: @"%s", buf];
            else
                user.name = @"";    

            buf = (char *)sqlite3_column_text(statement, 2);
            if (buf)
                user.surname = [NSString stringWithFormat: @"%s", buf];
            else
                user.surname = @"";

            buf = (char *)sqlite3_column_text(statement, 3);
            if (buf)
                user.email = [NSString stringWithFormat: @"%s", buf];
            else
                user.email = @"";

            buf = (char *)sqlite3_column_text(statement, 4);
            if (buf)
                user.telephone = [NSString stringWithFormat: @"%s", buf];
            else
                user.telephone = @"";

            int len = 0;
            len = sqlite3_column_bytes(statement, 5);

            NSData *imgData = [[NSData alloc] initWithBytes: sqlite3_column_blob(statement, 5) length: len];           

            UIImage *i;
            [i initWithData:imgData];

        }
    }
    sqlite3_finalize(statement);

    return user; 
}
我认为在编写时,应该使用[imageData bytes]和[imageData length]。 NSData是一个obj-C类,它不是一个无符号字符数组

我认为在编写时,应该使用[imageData bytes]和[imageData length]。
NSData是一个obj-C类,它不是一个无符号字符数组

Thanx all!!在你们的帮助下,我已经解决了这个问题,并想和我一样的未来初学者分享结果

-(void) addToDB
{
 NSLog(@"\nCreating db");
 NSString *str = @"CREATE TABLE IF NOT EXISTS Images (image1 BLOB);";
 int res = SQLITE_ERROR;


 res = sqlite3_open([@"aa.sql" UTF8String], &database);
 res = sqlite3_exec(database, [str UTF8String], NULL, NULL, NULL);

 sqlite3_stmt *updStmt =nil; 

 const char *sql = "INSERT INTO Images (image1) VALUES (?);";
 res = sqlite3_prepare_v2(database, sql, -1, &updStmt, NULL);

 if(res!= SQLITE_OK)
 {
  NSLog(@"Error while creating update statement:%@", sqlite3_errmsg(database));
 }

 UIImage *img = [UIImage imageNamed: @"flower.png"];
 NSData *imageData = [NSData dataWithData: UIImagePNGRepresentation(img)];

 res = sqlite3_bind_blob(updStmt, 1, [imageData bytes], [imageData length] , NULL);

 if((res = sqlite3_step(updStmt)) != SQLITE_DONE)
 {
  NSLog(@"Error while updating: %@", sqlite3_errmsg(database));
  sqlite3_reset(updStmt);
 } 

 res = sqlite3_reset(updStmt);
 res = sqlite3_close(database);
}

-(void) readFromDB
{
 NSLog(@"\nReading from db");

 NSString *query = @"SELECT image1 from Images";
 int res = SQLITE_ERROR;
 int len = 0;

 res = sqlite3_open([@"aa.sql" UTF8String], &database);

 sqlite3_stmt *statement;
 res = sqlite3_prepare_v2 (database, [query UTF8String], -1, &statement, nil);

 if (res == SQLITE_OK)
 {
  if (sqlite3_step(statement) == SQLITE_ROW)
  {
   len = sqlite3_column_bytes(statement, 0);
   NSData *imgData = [[NSData alloc] initWithBytes: sqlite3_column_blob(statement, 0) length: len];           


   UIImage *img = [[UIImage alloc] initWithData:imgData];

   self.view1.image = img;

  }
 }
 sqlite3_finalize(statement);

 res = sqlite3_close(database);
}

谢谢大家!!在你们的帮助下,我已经解决了这个问题,并想和我一样的未来初学者分享结果

-(void) addToDB
{
 NSLog(@"\nCreating db");
 NSString *str = @"CREATE TABLE IF NOT EXISTS Images (image1 BLOB);";
 int res = SQLITE_ERROR;


 res = sqlite3_open([@"aa.sql" UTF8String], &database);
 res = sqlite3_exec(database, [str UTF8String], NULL, NULL, NULL);

 sqlite3_stmt *updStmt =nil; 

 const char *sql = "INSERT INTO Images (image1) VALUES (?);";
 res = sqlite3_prepare_v2(database, sql, -1, &updStmt, NULL);

 if(res!= SQLITE_OK)
 {
  NSLog(@"Error while creating update statement:%@", sqlite3_errmsg(database));
 }

 UIImage *img = [UIImage imageNamed: @"flower.png"];
 NSData *imageData = [NSData dataWithData: UIImagePNGRepresentation(img)];

 res = sqlite3_bind_blob(updStmt, 1, [imageData bytes], [imageData length] , NULL);

 if((res = sqlite3_step(updStmt)) != SQLITE_DONE)
 {
  NSLog(@"Error while updating: %@", sqlite3_errmsg(database));
  sqlite3_reset(updStmt);
 } 

 res = sqlite3_reset(updStmt);
 res = sqlite3_close(database);
}

-(void) readFromDB
{
 NSLog(@"\nReading from db");

 NSString *query = @"SELECT image1 from Images";
 int res = SQLITE_ERROR;
 int len = 0;

 res = sqlite3_open([@"aa.sql" UTF8String], &database);

 sqlite3_stmt *statement;
 res = sqlite3_prepare_v2 (database, [query UTF8String], -1, &statement, nil);

 if (res == SQLITE_OK)
 {
  if (sqlite3_step(statement) == SQLITE_ROW)
  {
   len = sqlite3_column_bytes(statement, 0);
   NSData *imgData = [[NSData alloc] initWithBytes: sqlite3_column_blob(statement, 0) length: len];           


   UIImage *img = [[UIImage alloc] initWithData:imgData];

   self.view1.image = img;

  }
 }
 sqlite3_finalize(statement);

 res = sqlite3_close(database);
}
-(void) addToDB
{
 NSLog(@"\nCreating db");
 NSString *str = @"CREATE TABLE IF NOT EXISTS Images (image1 BLOB);";
 int res = SQLITE_ERROR;


 res = sqlite3_open([@"aa.sql" UTF8String], &database);
 res = sqlite3_exec(database, [str UTF8String], NULL, NULL, NULL);

 sqlite3_stmt *updStmt =nil; 

 const char *sql = "INSERT INTO Images (image1) VALUES (?);";
 res = sqlite3_prepare_v2(database, sql, -1, &updStmt, NULL);

 if(res!= SQLITE_OK)
 {
  NSLog(@"Error while creating update statement:%@", sqlite3_errmsg(database));
 }

 UIImage *img = [UIImage imageNamed: @"flower.png"];
 NSData *imageData = [NSData dataWithData: UIImagePNGRepresentation(img)];

 res = sqlite3_bind_blob(updStmt, 1, [imageData bytes], [imageData length] , NULL);

 if((res = sqlite3_step(updStmt)) != SQLITE_DONE)
 {
  NSLog(@"Error while updating: %@", sqlite3_errmsg(database));
  sqlite3_reset(updStmt);
 } 

 res = sqlite3_reset(updStmt);
 res = sqlite3_close(database);
}

-(void) readFromDB
{
 NSLog(@"\nReading from db");

 NSString *query = @"SELECT image1 from Images";
 int res = SQLITE_ERROR;
 int len = 0;

 res = sqlite3_open([@"aa.sql" UTF8String], &database);

 sqlite3_stmt *statement;
 res = sqlite3_prepare_v2 (database, [query UTF8String], -1, &statement, nil);

 if (res == SQLITE_OK)
 {
  if (sqlite3_step(statement) == SQLITE_ROW)
  {
   len = sqlite3_column_bytes(statement, 0);
   NSData *imgData = [[NSData alloc] initWithBytes: sqlite3_column_blob(statement, 0) length: len];           


   UIImage *img = [[UIImage alloc] initWithData:imgData];

   self.view1.image = img;

  }
 }
 sqlite3_finalize(statement);

 res = sqlite3_close(database);
}