简述
SQLite3
只是一个轻型的嵌入式数据库引擎,占用资源非常低,处理速度比Mysql
还快,专门用于移动设备上进行适量的数据存取,它只是一个文件,不需要服务器进程。
SQL
语句是SQL
操作的指令,我们用C/C++
访问数据库时,需要用char*
即C
字符串来保存SQL
语句,然后调用相应sqlite3
库的函数,传入C字符串,来执行SQL
指令。
下载
- sqlite官网
src
windows-dll
使用
- 把下载的源码中如下文件添加到工程源文件目录
sqlite3.c
sqlite3.h
sqlite3ext.h
sqlite3.def
- 配置属性->预处理器->预处理器定义,添加:
SQLITE_ENABLE_RTREE
SQLITE_ENABLE_COLUMN_METADATA
- 配置属性->链接器->输入->模块定义文件,添加:
sqlite3.def
操作
数据定义
- 新建表
create table table_name(字段名1 字段类型1,字段名2 字段类型2,...)
create table if not exists table_name(字段名1 字段类型1,字段名2 字段类型2,...)
- 删除表
drop table table_name
drop table if exists table_name
数据操作
- 添加
insert into table_name (name,age) values ('aet',18);
- 修改
update table_name set name = 'aet' ,age = 20;
update table_name set age = 20 where name = 'aet';
- 删除
delete from table_name
delete from table_name where age = 20;
delete from table_name where age > 12 and age < 20;
数据查询
select
存储类型
integer
real
text
blob
字段约束
not null
- 字段值不能为空
unique
- 字段值唯一
default
- 指定字段默认值
primary key
- 主键
- 作为唯一标识
- 可以是一个或多个字段
- 默认包含
not null
和unique
两个约束
autoincrement
- 当主键是
integer
类型时,添加autoincrement
可以实现主键值的自动增长
- 当主键是
foreign key
sqlite3
库函数
打开数据库
int sqlite3_open_v2(const char* filename,sqlite3** ppDb,int flags,const char* zVfs)
;
- 数据库文件路径
- 数据库实例
- 标识
SQLITE_OPEN_NOMUTEX
: 设置数据库连接运行在多线程模式SQLITE_OPEN_FULLMUTEX
:设置数据库连接运行在串行模式SQLITE_OPEN_SHAREDCACHE
:设置运行在共享缓存模式SQLITE_OPEN_PRIVATECACHE
:设置运行在非共享缓存模式SQLITE_OPEN_READWRITE
:指定数据库连接可以读写SQLITE_OPEN_CREATE
:如果数据库不存在,则创建
- 数据库虚拟机的名字
- 不需要:
NULL
- 不需要:
检查sql语句合法性
int sqlite3_prepare_v2(sqlite3* db,const char* zSql,int nByte,sqlite3_stmt** ppStmt,const char** pzTail);
- 数据库实例
- 需要检查的
sql
语句 sql
语句的最大字节长度-1
自动计算
stmt
句柄,存储sql stmt
指令
执行stmt句柄
int sqlite3_step(sqlite3_stmt* stmt);
stmt
句柄
获取第iCol字段的值
1 2 3 4 5 6 7 8 9 10 |
//浮点数据 double sqlite3_column_doulbe(sqlite3_stmt*,int iCol); //整型数据 int sqlite3_column_int(sqlite3_stmt*,int iCol); //长整型数据 sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*,int iCol); //二进制文本数据 const void* sqlite3_column_blob(sqlite3_stmt*,int iCol); //字符串数据 const unsigned char* sqlite3_column_text(sqlite3_stmt*,int iCol); |
示例
创建数据库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#include <sqlite3.h> sqlite3* sql = nullptr; const char* path = "aet.db"; //根据sql文件的路径打开数据库连接,若,数据库不存在,则创建 auto result = sqlite3_open_v2(path,&sql,SQLITE_OPEN_READWRITE| SQLITE_OPEN_CREATE|SQLITE_OPEN_NOMUTEX| SQLITE_OPEN_SHAREDCACHE,NULL); if (result == SQLITE_OK) std::clog << "open database success"; else std::clog << "open database failed"; |
增加删除修改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//sql语句 const char* sqlSentence = "insert into table_name(name,age) values('aet',25);"; //stmt语句句柄 sqlite3_stmt* stmt = nullptr; //检查语句合法性(-1表示系统自动计算sql语句长度) auto do_result = sqlite3_prepare_v2(sql,sqlSentence,-1,&stmt,NULL); if(do_result == SQLITE_OK) { std::clog << "add data success"; sqlite3_step(stmt); } else std::clog << "sql statement error"; //清理语句句柄,便于执行下一个语句 sqlite3_finalize(stmt); |
查询
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
const char* sqlSentence = "select name,age from table_name where age < 30;"; sqlite3_stmt* stmt = nullptr; auto sel_result = sqlite3_prepare_v2(sql,sqlSentence,-1,&stmt,NULL); if (sel_result == SQLITE_OK) { std::clog << "select statement is ok."; //每调用一次sqlite3_step语句,stmt语句句柄就会指向下一条记录 while(sqlite3_step(stmt) == SQLITE_ROW) { const unsigned char* name = sqlite3_column_text(stmt,0); int age = sqlite3_column_int(stmt,1); //处理查到的数据 } } else { std::clog << "select statement error"; } sqlite3_finalize(stmt); |
关闭数据库连接
1 2 3 4 5 |
if (sql) { sqlite3_close_v2(sql); sql = nullptr; } |
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ C++并发编程_同步并发(Condition_variable)05/21
- ♥ STL_priority_queue08/26
- ♥ 51CTO:C++编程技巧与规范08/01
- ♥ STL_list05/04
- ♥ C++_volatile10/08
- ♥ Soui八06/20