最近一直在忙着做数据库,不少同事问到数据库的问题,现在跟大家分享一下!
接着上次讲的知识点,还记得怎样把图片转换成NSData类型的格式吗??
很简单吧,在UIKit框架里有这个方法
NSData * UIImageJPEGRepresentation (
UIImage *image,
CGFloat compressionQuality
);
和
NSData * UIImagePNGRepresentation (
UIImage *image
);
写 到这里大家可能已经明白怎样将图片导进数据库了吧!!数据库中存放图片声音等都是
BLOB类型的,什么是BLOB类型呢?这个暂时先不在这里讲解了
从上个方法中得到的NSData类型就是我们要转换的基本格式了。废话不多说,且看代码:
/*
链接数据库部分略落
*/
创建数据表(就建立个简单的表格)
1 char *error;
2 NSString *createSQLite = @"create table if not exists LOVE(image_ID integer primary key,image BLOB)";//primary key 可不要漏掉,
3 if(sqlite3_exec(database,[createSQLite UTF8String],NULL,NULL,&error)!=SQLITE_OK)
4 {
5 sqlite3_close(database);//出错误了??那查看一下是否链接好数据库了··
6 }
好 了数据库我们已经建好了,接下来就是我们开始练兵的时候了,且看----------
××××××××××××××××××××××××××××××××××××××××××××××××××××
1 -(IBAction)insertImageToDB
2 {
3 NSData *data = UIImagePNGRepresentation([UIImage imageNamed:@"back.png"]);
4 // 还记得这个可爱的方法吗??哈
5 NSUInteger length = [data length];//这个法参数用来计算data数据的大小的 为什么?待会解释
6 sqlite3_stmt *statement; //
7 NSString *query = [[NSString alloc]
8 initWithString:@"INSERT OR REPLACE INTO LOVE(IMAGE) VALUES (?)"];
9 if(sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, NULL)!=SQLITE_OK)
10 {
11 //出错误了 去查看一下吧
12 NSLog(@"I have read an error");
13 return;
14 }
15 sqlite3_bind_blob(statement, 1, [data bytes], length, SQLITE_TRANSIENT);//这里对应query里的问号,第几个问号,里面的参数就填几···
16 sqlite3_step(statement);
17 sqlite3_finalize(statement);
18 sqlite3_close(database);// 忘了关闭你就白存了
19 }
×××××××××××××××××××××××××××××××××××××××××××××××××××××
// 就这么简单,不是吗??下面来读取一下看看我们的图片是不是乖乖的在数据库里了吧!·!!
×××××××××××××××××××××××××××××××××××××××××××××××××××××
1 -(IBAction)readDBImage
2 {
3 NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:kDefaultDbPath];
4 if (sqlite3_open([defaultDBPath UTF8String], &database) != SQLITE_OK) {
5 sqlite3_close(database);
6 NSAssert1(0, @"Failed to open database with message '%s'.", sqlite3_errmsg(database));
7 }
8 else
9 {
10 NSLog(@"Open Data DB Successful");
11 } //打开数据库 kDefaultDbPath 这个是你的数据库名字
12 NSString *query = @"select IMAGE from LOVE";
13 sqlite3_stmt *statement;
14 if(sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK)
15 {
16 NSLog(@"pass");
17 while(sqlite3_step(statement) == SQLITE_ROW)
18 {
19 NSData *imageData;
20 const void *test = sqlite3_column_blob(statement, 0);
21 int size = sqlite3_column_bytes(statement, 0);
22 imageData = [NSData dataWithBytes:test length:size];
23 CFShow(imageData);
24 UIImage *image = [UIImage imageWithData:imageData];
25 [imageView setImage:image]; //显示你的Image
26 break;
27 }
28 sqlite3_finalize(statement);
29 }
30 sqlite3_close(database);
31 }
用 iPhone 的 sqlite 数据库读写图片,先把你的图片转换成 NSData 形式,然后在数据库添加一行 blob 数据,代码如下(data就是图片) :
NSMutableString *insertSql = [[NSMutableString alloc] initWithString:@"INSERT INTO "];
[insertSql appendString:BLOB];
[insertSql appendString:@" ("];
[insertSql appendString:BLOB_DATA];
[insertSql appendString:@") VALUES(?1)"];
sqlite3_stmt *insert_statement = nil;
sqlite3 *database = 你的数据库;
if (sqlite3_prepare_v2(database, [insertSql UTF8String], -1, &insert_statement, NULL) == SQLITE_OK) {
sqlite3_bind_blob(insert_statement, 1, [data bytes], [data length], NULL);
if(sqlite3_step(insert_statement) != SQLITE_DONE) {
NSLog(@"Db error %s", sqlite3_errmsg(database));
}
} else {
NSLog(@"Db error %s", sqlite3_errmsg(database));
}
sqlite3_finalize(insert_statement);
[insertSql release];
You need to use a BLOB (Binary Large OBject) if you want to store the actual image from that URL.
//Storage
UIImage*image =...;//Retrieve image from URL
NSData*imageData =UIImagePNGRepresentation(image);
sqlite3_bind_blob(compiledStatement,1,[imageData bytes],[imageData length], NULL);
//Retrieval
constvoid*data = sqlite3_column_blob(compiledStatement,1);
int length = sqlite3_column_bytes(compiledStatement,1);
UIImage*retrieved =[UIImage imageWithData:
[NSData dataWithBytes:data length:length]];