Sqlite3入门和c/c++下使用

1. SQLite3基本介绍

1.1 数据库的数据类型

1.2 基本语法

  1. 创建数据表格

create table 表名(字段名 数据类型, 字段名 数据类型);

create table student(id int, name varchar(256), address text, QQ char(32));

  1. 插入数据

insert into 表名 values('字段数据','字段数据','字段数据','字段数据' );

insert into student values('20200101', '张三', '广州','25648');

insert into student values('20200102', '李四', '广州','25645');

  1. 查询数据

(1) 查询

select 字段名...字段名 from 表名;

字段名如果是多个可以用逗号隔开,如果是所有可以用星号*

select * from student ;

select name, qq from student;

(2) 条件查询

select 字段名...字段名 from 表名 where 条件;

select * from student where address='广州';

select * from student where address like '广%';
条件里面的where address='广州'; 等于号表示必须一样, 如果是模糊查询address like '广%';

如果是需要多个条件可以加and, 如果两个条件只需要成立一个加or即可

select 字段名...字段名 from 表名 where 条件 and 条件;

select 字段名...字段名 from 表名 where 条件 or 条件;

  1. 更新数据

update 表名 set 字段1=字段1值, 字段2=字段2值... where 条件表达式;

update student set qq='199999999999' where name='岳飞';

  1. 删除数据

delete from 表名;//删除整个表数据,不会删除表格

delete from 表名 where 条件;

delete from student where number='20200103';

  1. alter添加字段

alter table 表名 add column 字段 类型 (default '默认值');

alter table student add column age int ;

alter table student add column sex varchar(8) default '男' ;

  1. 创建带约束的数据表

PRIMARY KEY主键,NOT NULL不能为NULL,UNIQUE唯一,DEFAULT默认值,ID INTEGER PRIMARY KEY AUTOINCREMENT id自动增长

create table device (id integer primary key autoincrement,

name varchar(256) unique ,

status int not NULL default 0,

online int not NULL);

2. sqlite3 c/c++

sqliite3_open

int sqlite3_open(  // 打开数据库
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);
filename: 数据库文件路径
ppDb: 指向sqlite3的句柄指针
返回值: 0 SQLITE_OK 成功 其他错误码(非零值)失败

sqlite3_close

int sqlite3_close(sqlite3* pdb); // 关闭数据库文件
pdb: 关闭的sqlite数据库
返回值: 0 SQLITE_OK 成功 其他错误码失败

sqlite3_exec

int sqlite3_exec( // 执行SQL操作
  sqlite3* pdb,                                  /* An open database */
  const char *sql,                           /* SQL to be evaluated */
  int (*callback)(void*,int,char**,char**),  /* Callback function */
  void *arg,                                    /* 1st argument to callback */
  char **errmsg                              /* Error msg written here */
);
pdb: 数据库句柄
sql: SQL语句
callback: 回调函数,在使用select语句的时候使用,其他忽略
arg: 传递给回调函数的第一个参数
errmsg: 错误信息指针的地址
返回值: 0 SQLITE_OK 成功 其他错误码
// 回调函数 每找到一条记录,自动执行一次回调函数
typedef int (*sqlite3_callback)(void* arg, int f_num, char** f_value, char** f_name); 
arg: 传递给回调函数的参数
f_num: 记录中包含的字段数目
f_value: 包含每个字段值的指针数组
f_name: 包含每个字段名称的指针数组
返回值:0 成功 -1 失败

sqlite3_get_table

// 执行zsql指向的sql语句,将结果集相关数据的地址保存在函数的参数中
int sqlite3_get_table( 
  sqlite3 *db,          /* An open database */
  const char *zSql,     /* SQL to be evaluated */
  char ***pazResult,    /* Results of the query */
  int *pnRow,           /* Number of result rows written here */
  int *pnColumn,        /* Number of result columns written here */
  char **pzErrmsg       /* Error msg written here */
);
db: 数据库的标识
zsql: SQL语句,以分号结尾
pazResult: 指针数组的地址,记录结果集数据。
    内存布局:先依次存放各列的列名,然后是每一行各列的值。
pnRow:行数的指针地址
pnColumn: 列数的指针地址
pzErrmsg: 错误信息指针的地址

void sqlite3_free_table(char **result);
// 释放动态分配的收集结果的sqlite3_get_table参数pazResult

绑定参数都给定的sql位置

先准备sql语句,然后使用prepare函数,最后使用对应的bind函数绑定参数都对应的?号上,其中bind的第二个参数表示第几个问号。

void insert_face_data_toDataBase(const char *name, MByte *face_feature, MInt32 featureSize)
{
    // 准备sqlite3的插入语句
    sqlite3_prepare(db, "insert into face_data_table(name,face_feature,feature_size) values (?,?,?);", -1, &stmt, NULL);
    // 绑定name到第一个占位符
    sqlite3_bind_text(stmt, 1, name, strlen(name), NULL);
    // 绑定face_feature 到第二个占位符
    sqlite3_bind_blob(stmt, 2, face_feature, featureSize, NULL);
    // 绑定faceSize 到第三个占位符
    sqlite3_bind_int(stmt, 3, featureSize);
    sqlite3_step(stmt);
}

遍历查询结果的每一层

查询函数然后准备结果,一行一行遍历参数。

map<string, ASF_FaceFeature> QueryFaceFeature()
{
    ASF_FaceFeature asf_feature = {0, 0};
    map<string, ASF_FaceFeature> map;
    sqlite3_stmt *stmt;
    char *sql = "select name, feature_size, face_feature from face_data_table";
    int ret = sqlite3_prepare(db, sql, strlen(sql), &stmt, 0);
    int id = 0, len = 0;
    char * name;
    int feature_size;

    if (ret == SQLITE_OK)
    {
        while (sqlite3_step(stmt) == SQLITE_ROW) // 遍历查询结果的每一行
        {
            name = (char *)sqlite3_column_text(stmt, 0);  // 获取name
            printf("name = %s\n", name);
            feature_size = sqlite3_column_int(stmt, 1);   // 获取feature_size
            printf("feature_size = %d\n", feature_size);
            asf_feature.feature = (MByte *)malloc(feature_size);  // 分配内存以存储人脸特征数据
            const void *feature = sqlite3_column_blob(stmt, 2);    // 获取face_feature 字段  
            memset(asf_feature.feature, 0, feature_size);   // 将内存初始化为0
            memcpy(asf_feature.feature, feature, feature_size); // 复制人脸特征数据到 asf_feature.feature
            asf_feature.featureSize = feature_size;   // 设置asf_feature的大小
            string str(name);    // 将c字符串转为c++字符串
            map.insert(pair<string, ASF_FaceFeature>(str, asf_feature));  // 将数据插入map中
        }
    }
    
    sqlite3_finalize(stmt);
    sqlite3_close(db); 

    return map;
}
相关推荐
了一li1 小时前
Qt中的QProcess与Boost.Interprocess:实现多进程编程
服务器·数据库·qt
码农君莫笑2 小时前
信管通低代码信息管理系统应用平台
linux·数据库·windows·低代码·c#·.net·visual studio
别致的影分身2 小时前
使用C语言连接MySQL
数据库·mysql
京东零售技术3 小时前
“慢”增长时代的企业数据体系建设:超越数据中台
数据库
sdaxue.com4 小时前
帝国CMS:如何去掉帝国CMS登录界面的认证码登录
数据库·github·网站·帝国cms·认证码
o(╥﹏╥)4 小时前
linux(ubuntu )卡死怎么强制重启
linux·数据库·ubuntu·系统安全
阿里嘎多学长5 小时前
docker怎么部署高斯数据库
运维·数据库·docker·容器
Yuan_o_5 小时前
Linux 基本使用和程序部署
java·linux·运维·服务器·数据库·后端
Sunyanhui15 小时前
牛客网 SQL36查找后排序
数据库·sql·mysql
老王笔记5 小时前
MHA binlog server
数据库·mysql