Select sqlite3在数据库中插入和读取BLOB数据

Select sqlite3在数据库中插入和读取BLOB数据,select,insert,sqlite,blob,Select,Insert,Sqlite,Blob,我需要读写BLOB数据到数据库。这是我的结构表 #define CREATE_TABLE_USERS_SQL "CREATE TABLE IF NOT EXISTS %@ ( \ UserID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, \ Name VARCHAR(50), \ Image BLOB);" 如何将其插入数据库,然后从中检索 环境:iphonesdk4.1sqlite3数据库 此代码失败: NSData * b

我需要读写BLOB数据到数据库。这是我的结构表

    #define CREATE_TABLE_USERS_SQL "CREATE TABLE IF NOT EXISTS %@ ( \
UserID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, \
Name VARCHAR(50), \
Image BLOB);"
如何将其插入数据库,然后从中检索

环境:iphonesdk4.1sqlite3数据库

此代码失败:

        NSData * buf2 = [[NSData alloc] init];
        sqlite3_column_blob(statement, 5);
        buf2 = sqlite3_column_bytes(statement, 5);
        user.image = [UIImage imageWithData: buf2];
   NSData * buf2 = [[NSData alloc] init];
   sqlite3_column_blob(statement, 5);
   buf2 = sqlite3_column_bytes(statement, 5);
   user.image = [UIImage imageWithData: buf2];

除了选择您的客户机或编程接口外,用法与任何其他字符串字段都没有区别



[更新]我还没有幸运地为iPhone开发,但我相信它与任何其他选择或插入查询一样。确保对BLOB进行编码,并用单撇号(
)字符串将其括起来。

为什么不使用Gus Mueller等人关于飞肉的
fmdb


如果你发现
fmdb
很有用,那就去买一款Flying Meat的卓越应用吧。伏都教或阿克龙。

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

//-----插入图像

  - (void)setImage:(UIImage *)theImage
 {

  if(sqlite3_open([databasePath UTF8String],&myDatabase)==SQLITE_OK)
  {    
    NSString *insertProgrammeSql = @"INSERT INTO imageTable (imageName) VALUES (?)";

sqlite3_stmt *statement;

   if (sqlite3_prepare_v2(myDatabase, [insertProgrammeSql cStringUsingEncoding:NSUTF8StringEncoding], -1, &statement, NULL) == SQLITE_OK) {

    NSData *imageData = UIImagePNGRepresentation(theImage);

         sqlite3_bind_blob(statement, 1, [imageData bytes], [imageData length], SQLITE_TRANSIENT);

    sqlite3_step(statement);
}
  sqlite3_close(myDatabase);
//  return YES;    
}   


  }
//--------获取图像

   -(UIImage *)getImage

    {

    UIImage *image = nil;


if(sqlite3_open([databasePath UTF8String],&myDatabase)==SQLITE_OK)
{   

NSString *selectSql = @"SELECT image FROM imageTable";

sqlite3_stmt *statement;
if (sqlite3_prepare_v2(myDatabase, [selectSql UTF8String], -1, &statement, NULL) == SQLITE_OK)
{
    int length = sqlite3_column_bytes(statement, 0);
    NSData *imageData = [NSData dataWithBytes:sqlite3_column_blob(statement, 0 ) length:length];

    image = [UIImage imageWithData:imageData];



  sqlite3_finalize(statement);

  }
     sqlite3_close(myDatabase);
  }
 return image;
 }
此代码失败:

        NSData * buf2 = [[NSData alloc] init];
        sqlite3_column_blob(statement, 5);
        buf2 = sqlite3_column_bytes(statement, 5);
        user.image = [UIImage imageWithData: buf2];
   NSData * buf2 = [[NSData alloc] init];
   sqlite3_column_blob(statement, 5);
   buf2 = sqlite3_column_bytes(statement, 5);
   user.image = [UIImage imageWithData: buf2];
您正在以正确的顺序调用SQLite函数。根据SQLite文档:

最安全、最容易记住的策略是调用这些例程 通过以下方式之一:

  • sqlite3_column_text()后跟sqlite3_column_bytes()
  • sqlite3_column_blob()后跟sqlite3_column_bytes()
  • sqlite3_column_text16()后跟sqlite3_column_bytes16()
换句话说,您应该调用sqlite3_column_text(), 先使用sqlite3_column_blob()或sqlite3_column_text16()强制 将结果转换为所需格式,然后调用sqlite3_column_bytes()或 sqlite3_column_bytes16()以查找结果的大小。不要混在一起 调用sqlite3_column_text()或sqlite3_column_blob(),并调用 sqlite3_column_bytes16(),并且不要混合调用 sqlite3_column_text16(),调用sqlite3_column_bytes()


但是,
buff2
是一个整数,而不是数据指针
sqlite3\u column\u bytes
告诉你blob中有多少字节。

这个问题的问题和你的问题是一样的,答案应该满足你的需要:谢谢你的帖子,这段代码很好用。但是当我把图片的名称从“flower.png”改为“xyz.png”时然后它会在imageview中显示上一个图像,这样您就可以指出原因了……可能您需要先转到数据库中的相应记录,然后才从中读取图像,现在它总是先读取第一个记录。试试看,我真的不记得那是一年前了。在NSLog(@“创建更新语句时出错:%@”,sqlite3_errmsg(数据库));%应使用的格式在sqlite3\U bind\U BLOB调用中错误地使用了Constant SQLITE\U BLOB。应在此处使用SQLITE_瞬态或SQLITE_静态。使用SQLITE_时要小心。根据您的情况,它可能会导致错误的访问错误。这是我的情况,直到我将其更改为SQLITE_STATIC。