本文只针对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, 0, &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, 0, &zErrMsg);if( rc != SQLITE_OK ){fprintf(stderr, "SQL error: %s\n", zErrMsg);sqlite3_free(zErrMsg);}else{fprintf(stdout, "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,&db);if(res){fprintf(stderr, "Can't open database: %s\n", 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(), callback, 0, &zErrMsg);if( rc != SQLITE_OK ){fprintf(stderr, "SQL error: %s\n", zErrMsg);sqlite3_free(zErrMsg);}else{fprintf(stdout, "INSERT2 created successfully\n");}sqlite3_close(db);
}

写入数据方式二:

第二种写入数据的方式------------------------------------------sqlite3_exec(db,"begin;",0,0,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,TIME_START,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,2,local_ip.c_str(),-1,SQLITE_STATIC);sqlite3_bind_text(stmt,3,local_ip.c_str(),-1,SQLITE_STATIC);ret = sqlite3_step(stmt);
//        if(rc != SQLITE_DONE)
//        {
//            fprintf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
//            sqlite3_close(db);
//        }sqlite3_reset(stmt);sqlite3_finalize(stmt);}else{fprintf(stderr, "SQL error: %s\n", zErrMsg);}sqlite3_exec(db,"commit;",0,0,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, "SQL error: %s\n", 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

SQLite数据库使用(sqlite3 c++)相关推荐

  1. python建立sqlite数据库_python sqlite3 创建数据库

    Python标准库14 数据库 (sqlite3) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python自带一个轻量级的关 ...

  2. python对sqlite增删改查_Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】...

    本文实例讲述了python操作SQLite数据库的方法.分享给大家供大家参考,具体如下: SQLite简介 SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的 ...

  3. Sqlite数据库导入到MySQL中

    导出Sqlite数据库 下载sqlite3命令行工具,进入命令行 切换目录到数据库文件所在目录[把数据库文件拷贝到sqlite3目录下则跳过这步] 注意:在Windows下,目录是用\,在这里要输入两 ...

  4. 使用iOS原生sqlite3框架对sqlite数据库进行操作

    摘要: iOS中sqlite3框架可以很好的对sqlite数据库进行支持,通过面向对象的封装,可以更易于开发者使用. 使用iOS原生sqlite3框架对sqlite数据库进行操作 一.引言 sqlit ...

  5. c语言sqlite3写数据类型,在sqlite数据库中,int类型不等于integer数据类型

    在sqlite数据库中,int类型不等于integer数据类型 这些天一直在忙销售管理软件易卖通客户端的程序编写,由于需要采用本地数据缓存机制来提高程序的数据访问效率,所以需要在客户端使用一个小巧的本 ...

  6. sqlite数据库下载安装和初步操作和所遇到的问题near sqlite3:syntax error

    1.下载sqlite数据库:http://www.sqlite.org/download.html 如果是在window上安装需要在 Windows 区下载预编译的二进制文件.如图下载下载 sqlit ...

  7. pdo sqlite_ sqlite2 pdo_mysql_PHP数据库连接篇,PDO连接sqlite数据库,Sqlite安装使用说明!(PHP+Sqlite2和PHP+Sqlite3)...

    PHP+Sqlite2和PHP+Sqlite3 PHP数据库连接篇,PDO连接sqlite数据库,Sqlite安装使用说明! SQLite是一种轻量级的关系型数据库,可以内嵌在我们的应用程序中一起发布 ...

  8. python创建sqlite3数据库_Python连接SQLite数据库

    Python连接SQLite数据库 SQLite 是一种嵌入式数据库,它的数据库就是一个文件.由于 SQLite 本身是 C 写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在 iOS 和 ...

  9. 【SQLite数据库学习】 初步了解Sqlite3数据库

    目录 一:什么是数据库 二:为什么使用数据库 三:数据库的特点 四:如何使用数据库[关于数据库的常见术语] 五:常见的SQL语句的使用 一:什么是数据库 结构化查询语句 是一种对关系型数据库中的数据进 ...

  10. C++ VS2013环境编译使用sqlite数据库全过程

    转载:http://www.cnblogs.com/imoon/archive/2012/11/30/2796726.html 转载:https://blog.csdn.net/hjm4702192/ ...

最新文章

  1. Tableau可视化分析实战系列浏览 Tableau 环境(五) -视图的部件
  2. JAVA爬虫三大运营商
  3. mysql常用命令集合 及附图操作
  4. 在Elasticsearch中索引Java Bean的简单方法
  5. visualvm安装插件
  6. raspberry pi_使用Kubernetes在Raspberry Pi上进行集群计算
  7. 特斯拉得克萨斯超级工厂正式开业 计划明年开始生产电动皮卡
  8. 只用一个WiFi,渗透进企业全部内网
  9. vim常用操作技巧与配置
  10. 还在为保研和研究生毕业发愁吗?呐,给你推荐最近的几个保底的会议~
  11. 树莓派 红灯不亮_关闭树莓派的电源指示灯和状态指示灯
  12. SwitchHost常见问题解决
  13. python爬虫贴吧_Python爬虫——抓取贴吧帖子
  14. mysql outer apply_使用 CROSS APPLY 与 OUTER APPLY 连接查询
  15. html dom onblur,html的DOM中Event对象onblur事件用法实例
  16. C语言学习书籍推荐《明解C语言》下载
  17. 加拿大LMIA劳工批文有效期延长至18个月,为海外劳工在加拿大临时工作及移民创造便利条件
  18. 摘录的Tim Urban关于拖延症的总结
  19. 记住这三个方法,让你的钱越花越多
  20. Java生成PDF文件(Itext篇)

热门文章

  1. win7计算器功能详解
  2. 数据的经济活动及其所需要的权利
  3. 51单片机流水灯三种实现方法
  4. matlab fft时域采样,信号时域采样 谱分析(matlab).doc
  5. Solidworks二次开发 Addin模版使用
  6. localhost改成想要的IP方法
  7. 查看动态库.dll是多少位的
  8. window如何连接mysql_window怎么连接mysql
  9. SmartRF_Packet_Sniffer_2.18.1软件__2.18.0软件
  10. 自己动手写打印机监控程序