首页 > 数据库 >Sqlite3简单介绍与一些常用的例子

Sqlite3简单介绍与一些常用的例子

时间:2023-06-14 10:02:25浏览次数:29  
标签:常用 int 数据类型 ret sqlite3 例子 blob Sqlite3 数据


Sqlite3简单介绍与一些常用的例子


1:常用接口

  个人比较喜欢sqlite, 使用最方便,唯一的准备工作是下载250K的源;而且作者很热心,有问必答。

以下演示一下使用sqlite的步骤,先创建一个数据库,然后查询其中的内容。2个重要结构体和5个主要函数:

sqlite3               *pdb, 数据库句柄,跟文件句柄FILE很类似

sqlite3_stmt      *stmt, 这个相当于ODBC的Command对象,用于保存编译好的SQL语句

 

sqlite3_open(),   打开数据库

sqlite3_exec(),   执行非查询的sql语句

sqlite3_prepare(), 准备sql语句,执行select语句或者要使用parameter bind时,用这个函数(封装了sqlite3_exec).

Sqlite3_step(), 在调用sqlite3_prepare后,使用这个函数在记录集中移动。

Sqlite3_close(), 关闭数据库文件

 

还有一系列的函数,用于从记录集字段中获取数据,如

sqlite3_column_text(), 取text类型的数据。

sqlite3_column_blob(),取blob类型的数据

sqlite3_column_int(), 取int类型的数据

 2:sqlite数据类型介绍

     在进行数据库Sql操作之前,首先有个问题需要说明,就是Sqlite的数据类型,和其他的数据库不同,Sqlite支持的数据类型有他自己的特色,这个特色有时会被认为是一个潜在的缺点,但是这个问题并不在我们的讨论范围之内。
大 多数的数据库在数据类型上都有严格的限制,在建立表的时候,每一列都必须制定一个数据类型,只有符合该数据类型的数据可以被保存在这一列当中。而在 Sqlite 2.X中,数据类型这个属性只属于数据本生,而不和数据被存在哪一列有关,也就是说数据的类型并不受数据列限制(有一个例外:INTEGER PRIMARY KEY,该列只能存整型数据)。
但是当Sqlite进入到3.0版本的时候,这个问题似乎又有了新的答案,Sqlite的开发者 开始限制这种无类型的使用,在3.0版本当中,每一列开始拥有自己的类型,并且在数据存入该列的时候,数据库会试图把数据的类型向该类型转换,然后以转换 之后的类型存储。当然,如果转换被认为是不可行的,Sqlite仍然会存储这个数据,就像他的前任版本一样。
举个例子,如果你企图向一个INTEGER类型的列中插入一个字符串,Sqlite会检查这个字符串是否有整型数据的特征, 如果有而且可以被数据库所识别,那么该字符串会被转换成整型再保存,如果不行,则还是作为整型存储。

总的来说,所有存在Sqlite 3.0版本当中的数据都拥有以下之一的数据类型:
空(NULL):该值为空
整型(INTEGEER):有符号整数,按大小被存储成1,2,3,4,6或8字节。
实数(REAL):浮点数,以8字节指数形式存储。
文本(TEXT):字符串,以数据库编码方式存储(UTF-8, UTF-16BE 或者 UTF-16-LE)。
BLOB:BLOB数据不做任何转换,以输入形式存储。

ps: 在关系数据库中,CLOB和BLOB类型被用来存放大对象。BOLB表示二进制大对象,这种数据类型通过用来保存图片,图象,视频等。CLOB表示字符大对象,能够存放大量基于字符的数据。

对应的,对于数据列,同样有以下的数据类型:

TEXT
NUMERIC
INTEGER
REAL
NONE
数据列的属性的作用是确定对插入的数据的转换方向:

TEXT 将数据向文本进行转换,对应的数据类型为NULL,TEXT 或 BLOB
NUMERIC 将数据向数字进行转换,对应的数据类型可能为所有的五类数据,当试图存入文本 时将执行向整型或浮点类型的转换(视具体的数值而定),转换若不可行,则保留文本类型存储,NULL或BLOB不做变化
INTEGER 将数据向整型转换,类似于NUMERIC,不同的是没有浮点标志的浮点数将转换为整型保存
REAL 将数据向浮点数类型转换,类似于NUMERIC,不同的是整数将转换为浮点数保存
NULL 不做任何转换的数据列类型

实例代码如下,

附件工程可直接编译,例子使用了blob数据类型。

#include "sqlite3.h"                                //包含一个头文件就可以使用所以sqlite的接口了
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
 
#pragma comment(lib, "sqlite.lib")           //我把sqlite编译成了一个静态的lib文件。
 
void       createdb();
void       querydb();
 
int         main()
{
            createdb();
            querydb();
 
            return 0;
}
 
void       createdb()
{
            int                     ret;
            sqlite3               *pdb = 0;
            sqlite3_stmt      *stmt = 0;
            char                  *error = 0;
            char                  *sql = "insert into table1 values('value11',:aaa)";
            int        &nbs;            index;
            static void          *value = "asdfadsfasdfjasdfjaksdfaskjdfakdsfaksfja";
 
            ret = sqlite3_open("db1.sdb", &pdb);                    //打开数据库,跟打开文本文件一样
            if( ret != SQLITE_OK )
                        return;
            ret = sqlite3_exec(pdb, "create table table1(col1 char(20), col2 BLOB)", 0,0, &error );
            if( ret != SQLITE_OK )
                        return;
 
            ret = sqlite3_prepare(pdb, sql,strlen(sql), &stmt, &error);
            if( ret != SQLITE_OK )
                        return;
 
            index = sqlite3_bind_parameter_index(stmt, ":aaa");
 
            ret = sqlite3_bind_blob(stmt, index, value, strlen(value), SQLITE_STATIC);
            if( ret != SQLITE_OK )
                        return;
 
            ret = sqlite3_step(stmt);
 
            if( ret != SQLITE_DONE )
                        return;
 
            sqlite3_close(pdb);         
}
 
void       querydb()
{
            int                     ret;
            sqlite3   *pdb = 0;
            sqlite3_stmt      *pstmt = 0;
            char      *error = 0;
            char      *sql = "select * from table1";
            int                     len;
            int                     i;
            char      *name;
            void       *value;
 
            ret = sqlite3_open("db1.sdb", &pdb);
            if( ret != SQLITE_OK )
                        return;
 
            ret = sqlite3_prepare(pdb, sql, strlen(sql), &pstmt, &error);
            if( ret != SQLITE_OK )
                        return;
 
            while( 1 )
            {
                        ret = sqlite3_step(pstmt);
                        if( ret != SQLITE_ROW )
                                    break;
 
                        name = sqlite3_column_text(pstmt, 0);
                        value = sqlite3_column_blob(pstmt, 1);
                        len = sqlite3_column_bytes(pstmt,1 );
            }
}

 

实例二:SQLite中如何用api操作blob类型的字段

 

   在实际的编程开发当中我们经常要处理一些大容量二进制数据的存储,如图片或者音乐等等。对于这些二进制数据(blob字段)我们不能像处理普通的文本那样 简单的插入或者查询,为此SQLite提供了一组函数来处理这种BLOB字段类型。下面的代码演示了如何使用这些API函数。

 

首先我们要建立一个数据库:

sqlite3_exec(db, "CREATE TABLE list (fliename varchar(128) UNIQUE, fzip blob);", 0, 0, &zErrMsg);

 

//由于mmmm.rar是一个二进制文件,所以要在使用insert语句时先用?号代替
     sqlite3_prepare(db, "insert into list values ('mmmm.rar',?);", -1, &stat, 0);
 
     FILE *fp;
     long filesize = 0;
     char * ffile;
 
     fp = fopen("mmmm.rar", "rb");
 
     if(fp != NULL)
     {
         //计算文件的大小
         fseek(fp, 0, SEEK_END);
         filesize = ftell(fp);
         fseek(fp, 0, SEEK_SET);
 
         //读取文件
         ffile = new char[filesize+1];
         size_t sz = fread(ffile, sizeof(char), filesize+1, fp);
 
        fclose(fp);
     }
 
     //将文件数据绑定到insert语句中,替换“?”部分
     sqlite3_bind_blob(stat, 1, ffile, filesize, NULL);
 
//执行绑定之后的SQL语句
     sqlite3_step(stat);

这时数据库当中已经有了一条包含BLOB字段的数据。接下来我们要读取这条数据:

 

   

//选取该条数据
     sqlite3_prepare(db, "select * from list;", -1, &stat, 0);
     sqlite3_step(stat);
//得到纪录中的BLOB字段
const void * test = sqlite3_column_blob(stat, 1);
//得到字段中数据的长度
     int size = sqlite3_column_bytes(stat, 1);
 
     //拷贝该字段
     sprintf(buffer2, "%s", test);
此时可以将buffer2写入到文件当中,至此BLOB数据处理完毕。

 

实例三:sqlite 中用blob存储图片和取出图片

 

#include<iostream>
 #include<string>
 #include<sqlite3.h>using namespace std;
int main()
 {
         sqlite3 *db;
  sqlite3_stmt *stat;
  char *zErrMsg = 0; char buffer2[1024]="0";
  sqlite3_open("./MetaInfo.db", &db);
     int result;     if(result)
       {
          cout<<"Open the database sqlite.db failed"<<endl;
        }
    
      else
           cout<<"Open the database sqlite.db sucessfully"<<endl; sqlite3_exec(db, "CREATE TABLE list (fliename varchar(128) UNIQUE, fzip blob);", 0, 0, &zErrMsg);
  sqlite3_prepare(db, "insert into list values ('./data/2.bmp',?);", -1, &stat, 0);
  
  FILE *fp;
  long filesize = 0;
  char * ffile; fp = fopen("./data/2.bmp", "rb");
 if(fp != NULL)
  {
   fseek(fp, 0, SEEK_END);
   filesize = ftell(fp);
   fseek(fp, 0, SEEK_SET);  ffile = new char[filesize+1];
   size_t sz = fread(ffile, sizeof(char), filesize+1, fp);
    
   fclose(fp);
  } sqlite3_bind_blob(stat, 1, ffile, filesize, NULL);
  sqlite3_step(stat); sqlite3_prepare(db, "select * from list;", -1, &stat, 0);
  sqlite3_step(stat); const void * test = sqlite3_column_blob(stat, 1);
  int size = sqlite3_column_bytes(stat, 1); sprintf(buffer2, "%s", test);
 FILE *fp2;
 fp2 = fopen("outfile.png", "wb");
 if(fp2 != NULL)
  {
   size_t ret = fwrite(test, sizeof(char), size, fp2);
   fclose(fp2);
  } delete(ffile);
  sqlite3_finalize(stat);
  sqlite3_close(db);
    return 0;
 }

标签:常用,int,数据类型,ret,sqlite3,例子,blob,Sqlite3,数据
From: https://blog.51cto.com/u_16160131/6475606

相关文章

  • Oracle 19C常用sql
    1.元数据查询CDB中包含了所有容器的元数据信息,因此可以在CDB中查看所有的PDB元数据,而不必切入PDB中1.1.查看当前会话所在容器--查看當前所在容器,上邊的在sqlplus中執行,下邊的可以在工具中執行SHOWCON_NAME;SELECTcon_id,name,con_uidFROMv$containersWHEREcon_id=......
  • miniconda 常用指令
    创建新环境:condacreate-npy2python=2.7condacreate-n环境名字python版本删除环境:condaremove-npy2--allcondaremove-n环境名字--all(--all是清除全部)列出当前所有环境:condaenvlist进入某个环境:condaactivatepy2condaactivate环境名字退......
  • CSS常用属性
    颜色RGB(红,绿,蓝)三种颜色的集合,最低值是0(十六进制00)到最高值255(十六进制FF)HSLH色相(0-360),S饱和度(百分比),L亮度(百分比)(不)透明度rgba、hsla(新版浏览器可不写a,直接写4个值)line-height行间距(letter-spacing字母间间距,word-spacing单词间距)值描述normal默认。......
  • adb常用指令备忘
    adbdevices查看设备adbkill-server关闭adb后台服务进程adbtcpip让Android脱离USB线,启动tcp模式adbconnect连接开启了tcp模式的Android机adblogcat拉取手机的日志(过滤信息,linux中使用|grepxx,windows中使用|findstrxxx)adbbu......
  • docker常用命令
    帮助启动类命令·启动docker:systemctlstartdocker·停止docker:systemctlstopdocker·重启docker:systemctlrestartdocker·查看docker状态:systemctlstatusdocker·开机启动:systemctlenabledocker·查看docker概要信息:dockerinfo查看docker总体帮助文档:docke......
  • 10分钟让你掌握Linux常用命令(+3万+++收藏)
    1、常用Linux命令2、Linux下脚本编写3、windows下CMD常用命令文章目录一、目录操作1、批量操作二、文件操作三、文件内容操作(查看日志,更改配置文件)1、grep(检索文件内容)2、awk(数据统计)3、sed(替换文件内容)4、管道操作符`|`5、cut(数据裁剪)四、系统日志位置五、创建与删除软连......
  • 值得一看的35个Redis常用问题总结
    1.什么是redis?Redis是一个基于内存的高性能key-value数据库。2.Reids的特点Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可......
  • SQLServer低版本附加高版本的数据库常用处理方法
    SqlServer低版本数据库不能直接还原或附加Sql高版本数据库或备份文件,我们常用DTS互导的方式,如果不同版本数据库不可访问,可以使用高版本数据库的DTS导出整个库的相应低版本建库脚本与数据,然后放在低版本数据库中去执行,常见如:我们库数据库一般是SqlServer2008+,有的客户使用的是2005版......
  • 运维巡检常用命令
    Linux系统需要定期巡检,以检查服务器软硬件使用情况,确保可以及时发现问题、解决问题,降低损失。常用的巡检命令如下:uname-a查看内核/操作系统/CPU信息head-n1/etc/issue查看操作系统版cat/proc/cpuinfo查看CPU信息hostname查看计算机名lspci-tv列出所有PCI设备lsu......
  • 服务器巡检常用命令
    Linux系统需要定期巡检,以检查服务器软硬件使用情况,确保可以及时发现问题、解决问题,降低损失。常用的巡检命令如下:free-m查看内存使用量和交换区使用量df-h查看各分区使用情况du-sh<目录名>查看指定目录的大小uptime查看系统运行时间、用户数、负载w查看活动用户l......