在Sqlite数据库插入和读取图片数据

在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;  
  
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值