SQLite数据库使用sqlite3 c++

本文只针对sqlite3 c++ API调用。

1、基础知识

sqlite3只是一个嵌入式数据库引擎,占用资源非常底,可以适用于Windows和Linux,而且sqlite3只是一个文件,不需要服务器进程。

sqlite3 c++ api接口只需要引用sqlite3.h头文件就行。

常用术语表(table)、字段(column,列,属性)、记录(row,record)。

存储类型:integer(整型)、real(浮点型)、text(文本字符串)、blob(二进制数据)。

关键字:select、insert、update、delete、from、creat、where、desc、order、by、group、table、alter、view、index等,数据库中不能使用关键字命名表和字段。

2、数据库语句

2.1、创建或打开数据库

对应c++代码

    //不存在即创建数据库
    sqlite3* db;
    int res = sqlite3_open(sql_name,&db);
    if(res)
    {
        fprintf(stderr,"Can't open database: %s\n",sqlite3_errmsg(db));
        qDebug() << "database failed to open ";
    }
    else{
        qDebug() << "database open sucess";
    }

2.2、数据定义语句

  • 新建表 ⟹ create:create table 表名 (字段名1 字段类型1,字段名2 字段类型2,。。。); create table if not exists 表名 (字段名1 字段类型1,字段名2 字段类型2,。。。);

   CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT,name text NOT NULL,age integer NOT NULL); 

  • 删除表 ⟹ drop:dorp table 表名;drop table if exists 表名;

   DROP TABLE IF EXISTS t_person; 

对应c++代码:

//回调函数
static int callback(void *NotUsed,int argc,char **argv,char **azColName){
   int i;
   for(i=0; i<argc; i++){
      printf("%s = %s\n",azColName[i],argv[i] ? argv[i] : "NULL");
   }
   printf("\n");
   return 0;
}
    //判断表是否存在
    /* Create SQL statement */
    char *sql = "CREATE TABLE IF NOT EXISTS COMPANY("  \  //只是创建表 "CREATE TABLE COMPANY("
          "ID INT PRIMARY KEY     NOT NULL," \
          "TIME_START           TEXT    NOT NULL," \
          "TIME_END             TEXT    NOT NULL," \
          "DETECT_IP            TEXT    NOT NULL," \
          "CONTAINER_NUM        TEXT    NOT NULL," \
          "REAL_RESULTS         TEXT    NOT NULL," \
          "DETECT_RESULTS       TEXT    NOT NULL," \
          "DETECT_TIME          TEXT    NOT NULL," \
          "NOTE                 TEXT    NOT NULL);";

    /* Execute SQL statement */
     char *zErrMsg = 0;
    int rc = sqlite3_exec(db,sql,callback,&zErrMsg);
    if( rc != SQLITE_OK ){
    fprintf(stderr,"SQL error: %s\n",zErrMsg);
       sqlite3_free(zErrMsg);
    }else{
       fprintf(stdout,"Table created successfully\n");
    }
    //若存在则删除表
    /* drop SQL statement */
    char *sql_d = "DROP TABLE IF EXISTS COMPANY;";   //删除表不做判断 "DROP TABLE COMPANY("


    /* Execute SQL statement */
     char *zErrMsg = 0;
    int rc = sqlite3_exec(db,sql_d,NULL,"Table drop successfully\n");
    }

2.3、数据操作语句

  • 添加表中的数据 ⟹ insert:insert into 表名 (字段1,字段2,。。。) values (字段1的值,字段2的值);字符串内容用单引号。

   INSERT INTO t_person (name,age) VALUES ('大明', 22); 

  • 修改表中的数据 ⟹ update:update 表名 set 字段1 = 字段1的值,字段2 = 字段2的值,。。。;

    UPDATE t_person SET name = '小明',age = 10; // 把表中name字段的值全部改成小明,age字段的值全部改成10。  

    UPDATE t_person SET age = 12 WHERE name = '小明'; // 把表中name字段值是小明的age值改为12。  

  • 删除表中的数据 ⟹ delete:delete from 表名;delete from 表名 where 字段 = 字段值。

   DELETE FROM t_person; // 删除表中的所有记录。 

   DELETE FROM t_person WHERE age = 25; // 删除表中字段age等于25的这条记录。 

   DELETE FROM t_person WHERE age > 12 AND age < 15; // 删除表中年龄大于12且小于15的记录。 

写入数据方式一:


    sqlite3* db;
    int res = sqlite3_open(sql_name,sqlite3_errmsg(db));
        qDebug() << "database failed to open ";
    }
    else{
        qDebug() << "database2 open sucess";
    }

    /* INSERT SQL statement */

    ID += 1;
    time_start =QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz").toLongLong();
    time.start();
    char *zErrMsg = 0;
    std::string local_ip = "'192.168.53.21'";
    int64_t  time_end =QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz").toLongLong();
    std::string container_num = "'#^XH^123456^42G1^'";
    QString  isEmptoy = "'空箱'";
    //char detect_results = 0x00;
    std::string detect_results_sql;
    std::string note = "''" ;
    qDebug()<< "detect_results   :  "<<detect_results;
   
        detect_results_sql = "'未执行检测'";
        note = "'设备防夹保护触发,设备停止运动'";

    int timeElapsed = time.elapsed();
    qDebug()<< "timeElapsed   :  "<<timeElapsed<<" ms";
    //float detect_time = float(time_end -time_start)/1000;
    float detect_time = float(timeElapsed)/1000;

    std::string sql_add = "INSERT INTO COMPANY (ID,TIME_START,TIME_END,DETECT_IP,CONTAINER_NUM,REAL_RESULTS,DETECT_RESULTS,DETECT_TIME,NOTE) "
                          "VALUES(" + std::to_string(ID)+","+ std::to_string(time_start)+","+ std::to_string(time_end)+","+local_ip+","
                         ""+container_num+","+isEmptoy.toStdString()+","+detect_results_sql+","+std::to_string(detect_time)+","+note+"); " ;

    /* Execute SQL statement */
    int rc = sqlite3_exec(db,sql_add.c_str(),&zErrMsg);
    if( rc != SQLITE_OK ){
       fprintf(stderr,"INSERT2 created successfully\n");
    }
        sqlite3_close(db);
}

写入数据方式二:

第二种写入数据的方式------------------------------------------
    sqlite3_exec(db,"begin;",0);
    int64_t  time_start =QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz").toLongLong();
    std::string local_ip = "192.168.53.21";
    sqlite3_stmt *stmt;
    const char* sql_insert = "INSERT INTO COMPANY (ID,DETECT_IP) VALUES(?,?,? );" ;
    int ret = sqlite3_prepare_v2(db,sql_insert,-1,&stmt,0);
    if(ret == SQLITE_OK)
    {
        sqlite3_bind_int(stmt,1,1);
        sqlite3_bind_int64(stmt,2,time_start);
        //sqlite3_bind_text(stmt,local_ip.c_str(),SQLITE_STATIC);
        sqlite3_bind_text(stmt,3,SQLITE_STATIC);
        ret = sqlite3_step(stmt);
//        if(rc != SQLITE_DONE)
//        {
//            fprintf(stderr,sqlite3_errmsg(db));
//            sqlite3_close(db);
//        }
        sqlite3_reset(stmt);
        sqlite3_finalize(stmt);
    }
    else
    {
        fprintf(stderr,zErrMsg);
    }
    sqlite3_exec(db,"commit;",0);
    sqlite3_free(zErrMsg);

2.3查询数据

  • select:select 字段1, 字段2, 。。。 from 表名;select 字段1, 字段2, 。。。 from 表名 where 字段 = 某值;select * from 表名;(查询所有的字段)
  • 表别名:select 字段1 别名, 字段2 别名,。。。from 表名 别名;select 字段1 别名, 字段2 as 别名,。。。from 表名 as 别名;select 别名.字段1,别名.字段2,。。。from 表名 别名;

   SELECT name,age FROM t_person WHERE age < 80; 

   SELECT * FROM t_person WHERE age < 80; 

   SELECT name,age nianling FROM t_person ren WHERE ren.age > 80 AND nianling < 90; 

  • 计算记录条数:select count(字段或者*) from 表名;

   SELECT count(name) FROM t_person ren WHERE ren.age > 80; 

   SELECT count(*) FROM t_person ren WHERE ren.age > 80; 

  • where:where 字段 = 某值;where 字段 is 某值;where 字段 != 某值;where 字段 is not 某值;where 字段 > 某值;where 字段1 = 某值1 and 字段2 < 某值2;where 字段1 = 某值1 or 字段2 > 某值2;
  • order by:select * from 表名 order by 字段(默认升序);select * from 表名 order by 字段 desc(降序);select * from 表名 order by 字段 asc(升序);select * from 表名 order by 字段1 asc(先按字段1升序),字段2 desc(再按字段2降序);

   SELECT * FROM t_person WHERE age < 100 ORDER BY age DESC,name ASC; // 先按年龄降序,再按名字升序。  

  • limit:select * from 表名 limit 数值1,数值2;分页查询,数值1表示跳过前面多少条,数值2表示取出之后多少条。select * from 表名 limit 数值2;(跳过前面0条,相当于select * from 表名 limit 0,数值2,表示最前面多少条数据)

   SELECT * FROM t_person WHERE age < 100 ORDER BY age DESC,name ASC LIMIT 3, 5; // 先筛选,后排序,再分页。 

  • like:模糊查询,select 字段1, 字段2, 。。。 from 表名 where 字段 like %某值%;

   SELECT * FROM t_person WHERE name like '%明%'; 

查询ID:(用处:获取当前数据库的所写的行数)

    //获取当前数据库最大ID值
    char **dbresult;
    int nrow,ncolumn;
    char *sql_select = "SELECT * from COMPANY";
    res = sqlite3_get_table(db,sql_select,&dbresult,&nrow,&ncolumn,&zErrMsg);
    if(res == SQLITE_OK)
    {
        //查询成功
        ID = nrow;
        qDebug() << "nrow :" <<  nrow;
    }
    else{
        fprintf(stderr,zErrMsg);
        qDebug() << "SELECT error :" ;
    }
    //释放 dbresult 的查询结果
    sqlite3_free_table(dbresult);

3、Ubuntu和nano安装sqlite3

3.1、Ubuntu安装sqlite3

sudo apt-get install sqlite3
//查看版本信息
sqlite3 -version

3.2、nano安装sqlite3

使用apt在Nano上安装,但是找不到sqlite3.h,所以只能使用源码编译。

下载源码:SQLite Download Page

//解压
tar xvzf sqlite-autoconf-3310100.tar.gz
//进入sqlite文件夹
cd sqlite-autoconf-3310100
//配置文件
./configure
//开始编译
make
//写入系统文件中
sudo make install
//查看文件路径
dpkg -L sqlite3

原文地址:https://blog.csdn.net/PC1022

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


SQLite架构简单,又有Json计算能力,有时会承担Json文件/RESTful的计算功能,但SQLite不能直接解析Json文件/RESTful,需要用Java代码硬写,或借助第三方类库,最后再拼成insert语句插入数据表,代码非常繁琐,这里就不展示了。参考前面的代码可知,入库的过程比较麻烦,不能只用SQL,还要借助Java或命令行。SPL是现代的数据计算语言,属于简化的面向对象的语言风格,有对象的概念,可以用点号访问属性并进行多步骤计算,但没有继承重载这些内容,不算彻底的面向对象语言。...
使用Python操作内置数据库SQLite以及MySQL数据库。
破解微信数据库密码,用python导出微信聊天记录
(Unity)SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。SQLite 源代码不受版权限制。本教程将告诉您如何使用 SQLite 编程,并让你迅速上手。.................................
安卓开发,利用SQLite实现登陆注册功能
相比大多数数据库而言,具有等优势,广泛应用于、等领域。
有时候,一个项目只有一个数据库,比如只有SQLite,或者MySQL数据库,那么我们只需要使用一个固定的数据库即可。但是一个项目如果写好了,有多个用户使用,但是多个用户使用不同的数据库,这个时候,我们就需要把软件设计成可以连接多个数据库的模式,用什么数据库,就配置什么数据库即可。4.Users实体类,这个实体类要和数据库一样的,形成一一对应的关系。11.Sqlite数据库,需要在代码里面创建数据库,建立表,再建立数据。8.我们开启MySQL数据库,然后进行调试,看程序的结果。2.安装SqlSugar。
基于Android的背单词软件,功能强大完整。
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统。说白了就是使用起来轻便简单,
Android的简单购物车案例
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库...
Qt设计较为美观好看的登录注册界面(包含SQLite数据库以及TCP通信的应用)
SQLite是用C语言开发的跨平台小型数据库,可嵌入其他开发语言,也可在单机执行。SPL是用Java开发的跨平台的数据计算语言,可嵌入Java,可在单机执行,可以数据计算服务的形式被远程调用。两者的代码都是解释执行的。...
新建库.openDATA_BASE;新建表createtableLIST_NAME(DATA);语法:NAME关键字...<用逗号分割>删除表droptableNAME;查看表.schema查看表信息新建数据insertintoLIST_NAMEvalues();语法:CLASS,PARAMETER...,CLASS是类别,PARAMETER是参数<用逗号分割新建的
importsqlite3classDemo01:def__init__(self):self.conn=sqlite3.connect("sql_demo_001.db")self.cursor1=self.conn.cursor()self.cursor1.execute("select*fromtable_001wherename=?andid=?",('ssss&#0
 在客户端配置文件<configuration>节点下,添加:<connectionStrings>      <add name="localdb" connectionString="Data Source=config/local.db;Version=3;UseUTF16Encoding=True;" providerName="System.Data.SQLite.SQLiteFactory"/&g
提到锁就不得不说到死锁的问题,而SQLite也可能出现死锁。下面举个例子:连接1:BEGIN(UNLOCKED)连接1:SELECT...(SHARED)连接1:INSERT...(RESERVED)连接2:BEGIN(UNLOCKED)连接2:SELECT...(SHARED)连接1:COMMIT(PENDING,尝试获取EXCLUSIVE锁,但还有SHARED锁未释放,返回SQLITE_BUSY)连接2:INSERT...
SQLite是一种嵌入式数据库,它的数据库就是一个文件。由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成。Python就内置了SQLite3,所以,在Python中使用SQLite,不需要安装任何东西,直接使用。在使用SQLite前,我们先要搞清楚几个概念:表
设计思想————首先要确定有几个页面、和每个页面的大致布局由于是入门,我也是学习了不是很长的时间,所以项目比较low。。。。第一个页面,也就是打开APP的首页面:今天这个博客,先实现添加功能!:首先对主界面进行布局:其中activity_main.xml的代码为<?xmlversion="1.0"encoding="