sqlite 添加图片

该博客介绍了如何使用SQLite数据库存储和读取图片。通过将图片二进制数据转换为Blob类型,写入数据库,然后从数据库读取Blob数据并还原为UIImage对象。示例代码分别展示了插入和查询图片数据的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在iOS下用sqlite数据库存储图片,先把你的图片转换成 NSData 形式,然后在数据库添加一行 blob 数据

  假定数据库中存在表 test_table(name,image), 下面代码将图片文件test.png的二进制数据写到sqlite数据库:

  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, 1);    //获取长度

  Byte * VALUE = (Byte*)sqlite3_column_blob(getimg, 1);    //获取数据

  IF (bytes !=0 && VALUE != NULL)

  {

  NSData * DATA = [NSData dataWithBytes:VALUE LENGTH:bytes];    //二进制转化为data型

  UIImage * img = [UIImage imageWithData:DATA];      //data型转化成image

        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:存储图片

  / 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);

  }

  读取图片:

  // 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;

  }

SQLite本身并不直接支持存储二进制数据,如图片,因为它不是设计用于大规模媒体文件存储的。然而,你可以通过将图片转换为Base64编码字符串或文件路径的方式来间接存储。这里我们介绍两种常见方法: **方法一:Base64编码** 1. 首先,将图片转换为字节数组。 2. 将字节数组转换为Base64字符串。 ```java byte[] imageBytes = getBitmapAsByteArray(bitmap); // 获取Bitmap对象转化为字节数组 String base64Image = Base64.encodeToString(imageBytes, Base64.DEFAULT); ``` 3. 然后,在插入到数据库时,将Base64字符串作为字段值存储。 ```java String sql = "INSERT INTO images (id, name, image_data) VALUES (?, ?, ?)"; ContentValues values = new ContentValues(); values.put("id", someId); values.put("name", imageName); values.put("image_data", base64Image); database.insertOrThrow("images", null, values); ``` **方法二:保存到外部文件系统** 1. 将图片保存到设备的私有文件夹,例如`getExternalFilesDir()`返回的目录。 2. 保存文件路径到数据库。 ```java File file = saveImageToPrivateDirectory(bitmap, fileName); String filePath = file.getAbsolutePath(); ``` 3. 更新数据库记录,包含文件路径。 ```java sql = "UPDATE images SET image_path = ? WHERE id = ?"; values = new ContentValues(); values.put("image_path", filePath); database.update("images", values, "id = ?", new String[]{someId}); ``` **相关问题--:** 1. 如何从数据库中读取Base64图片? 2. 如何处理大图片以避免内存溢出? 3. 应该如何定期清理存储在数据库中的图片
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值