在iOS下用sqlite数据库存储图片,先把你的图片转换成 NSData 形式,然后在数据库添加一行 blob 数据
假定数据库中存在表 test_table(name,image), 下面代码将图片文件test.png的二进制数据写到sqlite数据库:
例1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
CHAR *name = "test";
NSString * nameString = [NSString stringWithCString:name encoding:NSUTF8StringEncoding]; NSString * filePath = [[NSBundle mainBundle] pathForResource:nameString ofType:@"png"]; IF ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) { NSData * imgData = UIImagePNGRepresentation([UIImage imageWithContentsOfFile:filePath]); const CHAR * sequel = "insert into test_table(name,image) values(?,?)"; sqlite3_stmt * UPDATE; IF (sqlite3_prepare_v2(DATABASE, sequel, -1, &UPDATE, NULL) == SQLITE_OK) { sqlite3_bind_text(UPDATE, 1, name, -1, NULL); sqlite3_bind_blob(UPDATE, 2, [imgData bytes], [imgData LENGTH], NULL); IF( sqlite3_step(UPDATE) == SQLITE_DONE) { NSLog(@"已经写入数据"); } sqlite3_finalize(UPDATE); } } ELSE { NSLog(@"文件不存在"); } 下面代码从数据库中读取图片二进制数据,然后显示图片: const CHAR * sequel = "select image from test_table where name=?"; sqlite3_stmt * getimg; IF (sqlite3_prepare_v2(DATABASE, sequel, -1, &getimg, NULL) == SQLITE_OK) { CHAR *name = "test"; sqlite3_bind_text(UPDATE, 1, name, -1, NULL); IF(sqlite3_step(getimg) == SQLITE_ROW) { INT bytes = sqlite3_column_bytes(getimg, 0); Byte * VALUE = (Byte*)sqlite3_column_blob(getimg, 1); IF (bytes !=0 && VALUE != NULL) { NSData * DATA = [NSData dataWithBytes:VALUE LENGTH:bytes]; UIImage * img = [UIImage imageWithData:DATA]; UIImageView * aview =[[UIImageView alloc] initWithFrame: CGRectMake(0.0, 0.0, IMAGE_WIDTH, IMAGE_HEIGHT)]; aview.image = img; [SELF.VIEW addSubview:aview]; [aview release]; } } sqlite3_finalize(getimg); } |
例2:存储图片
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// Save Small Image Data by given main url
- (void) SaveImagesToSql: (NSData*) imgData :(NSString*) mainUrl { NSLog( @"\n*****Save image to SQLite*****\n" ); const char* sqliteQuery = "INSERT INTO IMAGES (URL, IMAGE) VALUES (?, ?)"; sqlite3_stmt* statement; if( sqlite3_prepare_v2(articlesDB, sqliteQuery, -1, &statement, NULL) == SQLITE_OK ) { sqlite3_bind_text(statement, 1, [mainUrl UTF8String], -1, SQLITE_TRANSIENT); sqlite3_bind_blob(statement, 2, [imgData bytes], [imgData length], SQLITE_TRANSIENT); sqlite3_step(statement); } else NSLog( @"SaveBody: Failed from sqlite3_prepare_v2. Error is: %s", sqlite3_errmsg(articlesDB) ); // Finalize and close database. sqlite3_finalize(statement); } |
读取图片:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// Load images from data base with given image url
- (NSData*) LoadImagesFromSql: (NSString*) imageLink { NSData* data = nil; NSString* sqliteQuery = [NSString stringWithFormat:@"SELECT IMAGE FROM IMAGES WHERE URL = '%@'", imageLink]; sqlite3_stmt* statement; if( sqlite3_prepare_v2(articlesDB, [sqliteQuery UTF8String], -1, &statement, NULL) == SQLITE_OK ) { if( sqlite3_step(statement) == SQLITE_ROW ) { int length = sqlite3_column_bytes(statement, 0); data = [NSData dataWithBytes:sqlite3_column_blob(statement, 0) length:length]; } } // Finalize and close database. sqlite3_finalize(statement); return data; } |