Select sqlite3在数据库中插入和读取BLOB数据
我需要读写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
#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()
但是,
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。