iOS中如何把圖片存放入SQLite資料庫
阿新 • • 發佈:2019-01-23
有時候我們需要把一些圖片檔案存放到本地,當然可以直接存入沙盒路徑下;這裡想到另外的方法,就是直接將圖片資料存到資料庫中(只是想實現一下,不是很方便,建議不要用,可以把圖片存入沙盒,然後把儲存路徑存入資料庫,這樣比較合理)。
這樣對於包含圖片資訊的列表形式的資料的儲存就方便多了,當然我們也可以把列表資料中的圖片的網路路徑存入資料庫,但是這樣做,下次需要展示時還是要請求,也就是本地化做的並不徹底。
下面我們來說說如何實現(這裡就不做網路路徑下圖片的讀取了,直接用本地圖片代替,主要介紹如何將圖片存入資料庫,如用到網路圖片請自行處理):
方法一:利用sqlite資料庫的blob型別的資料存取
假定資料庫中存在表 imageTable(name text,image blob), 下面程式碼將圖片檔案test.png的二進位制資料寫到sqlite資料庫:
NSString * filePath = [[NSBundle mainBundle] pathForResource: @"test" ofType:@"png"]; if ([[NSFileManager defaultManager] fileExistsAtPath:filePath])//判斷圖片是否存在 { char *name="test"; NSData * imgData = UIImagePNGRepresentation([UIImage imageWithContentsOfFile:filePath]); const char * sequel = "insert into imageTable (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 imageTable 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]; } } sqlite3_finalize(getimg); }
方法二:將圖片轉化成base64編碼格式的字串,直接以字串的形式存放入資料庫
存取方法不做過多介紹,上篇已經做過介紹,主要展示以下轉化過程:
//圖片轉化為base64字串
UIImage *originImage = [UIImage imageNamed:@"origin.png"];
NSData *data = UIImageJPEGRepresentation(originImage, 1.0f);
NSString *encodedImageStr = [data base64Encoding];
NSLog(@"Encoded image:%@", encodedImageStr);
//base64字串轉化為圖片
NSData *decodedImageData = [[NSData alloc] initWithBase64Encoding:encodedImageStr];
UIImage *decodedImage = [UIImage imageWithData:decodedImageData];
NSLog(@"Decoded image size: %@", NSStringFromCGSize(decodedImage.size));
兩種方法本質上貌似都是將圖片轉化成了八位一組的二進位制字串的形式,對於byte[]和base64的瞭解,請看一下連結: