sqlite3插入并读取数据库中的BLOB数据
我需要读取和写入BLOB数据到数据库。这里是我的结构表sqlite3插入并读取数据库中的BLOB数据
#define CREATE_TABLE_USERS_SQL "CREATE TABLE IF NOT EXISTS %@ (\
UserID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, \
Name VARCHAR(50), \
Image BLOB);"
如何将它插入数据库,然后从中检索?
环境:iPhone SDK 4.1 SQLite3数据库。
此代码失败:
NSData * buf2 = [[NSData alloc] init];
sqlite3_column_blob(statement, 5);
buf2 = sqlite3_column_bytes(statement, 5);
user.image = [UIImage imageWithData: buf2];
除了选择您的客户端或编程接口,使用不从任何其他字符串字段不同。
[更新]我还没有开发iPhone的运气,但我相信它和任何其他SELECT或INSERT查询一样。确保对BLOB进行编码并用字符串单撇号('
)将其括起来。
我添加了一个问题 – yozhik 2010-11-18 14:06:05
为什么不使用fmdb
通过Gus Mueller 等人,飞肉? http://flyingmeat.com/
如果您发现fmdb
有用,去买肉飞的excellents应用程序之一。 VoodooPad或Acron。
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:%s", 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] , SQLITE_TRANSIENT);
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);
}
感谢张贴,这段代码很好。但是当我从“flower.png”更改图像的名称为“xyz.png”之类的其他图像时,它会显示上一张图像在imageview中,你可以指出原因....... – 2011-09-30 10:58:40
maby你需要先到数据库中的相应记录,然后才从它读取图像,现在它总是需要第一个记录。试试看,我真的不记得是在一年前。 NSLog中的 – yozhik 2011-09-30 12:20:40
(@“创建更新语句时出错:%@”,sqlite3_errmsg(database));应使用%s格式化 – 2013-01-29 19:05:11
// -----插入图片
- (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];
您正在以正确的顺序调用SQLite函数。据SQLite的文档:
最安全,最容易记住的政策是通过以下方式之一来调用这些例程 :),其次是sqlite3_column_bytes()
- sqlite3_column_text(
- sqlite3_column_blob (),随后接着sqlite3_column_bytes16 sqlite3_column_bytes()
- sqlite3_column_text16()()
换句话说,你应该首先调用sqlite3_column_text(), sqlite3_column_blob(),或sqlite3_column_text16()到 结果迫使所需的格式,然后调用sqlite3_column_bytes()或 sqlite3_column_bytes16()来查找结果的大小。不要将 调用与调用 sqlite3_column_bytes16()的调用混合使用sqlite3_column_text()或sqlite3_column_blob(),并且不要将调用与 sqlite3_column_text16()调用混合并调用sqlite3_column_bytes()。
但是,buff2
是一个整数,而不是数据指针。 sqlite3_column_bytes
告诉你blob中有多少个字节。
此问题与您的要求相同,并且其中的答案应该解决您的需求:http://stackoverflow.com/questions/643682/reading-and-writing-images-to-an-sqlite-db- for iphone- – 2010-11-18 22:06:07