作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生在读,研究方向无线联邦学习
擅长领域:驱动开发,嵌入式软件开发,BSP开发
作者主页:一个平凡而乐于分享的小比特的个人主页
文章收录专栏:网络socket编程之温度采集智能存储与上报项目,本专栏为网络socket编程之温度采集智能存储与上报项目技术简介,实现流程分析
项目源码:https://gitee.com/TJF865975/project1_ds18b20,README部分包含项目功能及实现,欢迎大家Watch、Star、Fork。
欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖
1.sqlite3简介
SQLite3是一种轻量级的关系型数据库,可以在本地磁盘上存储数据。
2.sqlite3安装
c
sudo apt-get install sqlite3
3.系统命令
c
.help //帮助
.quit //退出
.exit //退出
.schema //查看表的结构图
4.sqlite3使用
4.1 打开数据库
使用命令行工具或SQLite客户端工具打开一个SQLite数据库文件,如:
c
sqlite3 mydatabase.db
如果文件不存在,则会自动创建一个新的数据库文件。
4.2 创建表格
使用CREATE TABLE命令创建一个新的表格,例如:
c
CREATE TABLE users ( id INTEGER PRIMARY KEY, name TEXT, age INTEGER );
上述语句创建了一个名为"users"的表格,其中包含三个列:id、name和age。
4.3 插入数据
使用INSERT INTO命令插入新的数据行,例如:
c
INSERT INTO users (name, age) VALUES ('Alice', 25);
上述语句将一行新的数据插入到"users"表格中,包含两个列:name和age,其中name为"Alice",age为25。
4.4 查询数据
使用SELECT语句查询表格中的数据行,例如:
c
SELECT * FROM users;
上述语句将返回"users"表格中的所有数据行。
4.5 更新数据
使用UPDATE语句更新表格中的数据行,例如:
c
UPDATE users SET age = 26 WHERE name = 'Alice';
上述语句将更新"users"表格中名为"Alice"的行的age列为26。
如果您想要修改SQLite数据库中某段数据的某个值,可以使用UPDATE语句。
UPDATE语句允许您更新一个或多个列的值,可以使用WHERE子句来指定要更新的特定行。下面是一个基本的UPDATE语句的语法:
c
UPDATE table_name SET column1 = new_value1, column2 = new_value2 WHERE some_column = some_value;
其中,table_name是要更新的表格的名称,column1和column2是要更新的列的名称,new_value1和new_value2是您要将这些列的值更新为的新值。WHERE子句用于指定要更新的特定行,some_column是用于指定行的列的名称,some_value是该列的值。
例如,如果您想要将users表格中id为1的用户的email更新为new_email@example.com,可以使用以下语句:
c
UPDATE users SET email = 'new_email@example.com' WHERE id = 1;
注意,如果没有WHERE子句,则将更新所有行。因此,请确保在更新数据之前指定WHERE子句,以便只更新您要更新的特定行。
4.6 删除数据
使用DELETE FROM语句删除表格中的数据行,例如:
c
DELETE FROM users WHERE name = 'Alice';
上述语句将删除"users"表格中名为"Alice"的行。
在 SQLite 中,删除数据的方式有以下几种:
- 使用 DELETE 语句删除单个或多个行。
- 使用 DROP TABLE 语句删除整个表。
- 使用 TRUNCATE TABLE 语句删除整个表的所有行。
- 使用 VACUUM 命令回收未使用的空间,从而删除已删除行占用的空间。
以下是每种方式的详细说明:
4.6.1 DELETE 语句
使用 DELETE 语句删除单个或多个行:
c
DELETE FROM tableName WHERE condition;
其中,tableName 是要删除数据的表名,condition 是 WHERE 子句中的条件,指定要删除的行。如果 WHERE 子句为空,则将删除表中的所有行。
4.6.2 DROP TABLE 语句
使用 DROP TABLE 语句删除整个表:
c
DROP TABLE tableName;
其中,tableName 是要删除的表名。
注意:使用 DROP TABLE 将完全删除表,包括表结构和数据,因此在使用此语句之前,请确认您是否真的要删除整个表。
4.6.3 TRUNCATE TABLE 语句
使用 TRUNCATE TABLE 语句删除整个表的所有行:
c
TRUNCATE TABLE tableName;
其中,tableName 是要清空数据的表名。
注意:TRUNCATE TABLE 与 DELETE 不同,它将删除表中的所有行,但不删除表本身,也不返回被删除的行数。此外,TRUNCATE TABLE 不触发表的 DELETE 或 UPDATE 触发器。
4.6.4 VACUUM 语句
使用 VACUUM 命令回收未使用的空间,从而删除已删除行占用的空间:
c
VACUUM;
VACUUM 命令将重新组织表的物理存储,回收未使用的空间,并将被删除的行从表中完全删除。这可以使数据库文件更小,因为它将未使用的空间释放给操作系统。
4.7关闭数据库
关闭数据库 使用.exit命令或者关闭SQLite客户端工具来关闭数据库连接。
以上是SQLite3的基本用法和语法。实际使用时,可以通过SQLite的C/C++ API或者其他编程语言的SQLite封装库来与SQLite数据库进行交互。
5.sqlite数据类型
SQLite 支持以下数据类型:
- NULL:空值。
- INTEGER:带符号整数,包括 1、2、3、4、6 或 8 个字节,取决于值的大小。
- REAL:浮点数,存储为 8 字节的 IEEE 浮点数。
- TEXT:字符串,采用编码方式存储。
- BLOB:二进制数据,存储为输入的内容。
VARCHAR 是一种在关系数据库中常见的列类型,也是 SQLite 中的列类型之一。它用于存储可变长度的字符串。与 CHAR 类型不同,VARCHAR 类型只使用存储所需的空间,不会预分配固定的空间。VARCHAR 的最大长度取决于数据库的限制,通常为 65535 个字符。
在 SQLite 中,VARCHAR 列类型可以用 TEXT 类型代替,因为它们是同义词,实际上没有任何区别。例如,以下两个定义是等价的:
c
CREATE TABLE myTable (id INTEGER PRIMARY KEY, name VARCHAR(50)); CREATE TABLE myTable (id INTEGER PRIMARY KEY, name TEXT(50));
此外,SQLite 还支持列类型的别名,如 INT 和 BOOLEAN,这些别名与其他列类型完全相同。还有其他列类型的别名,如 VARCHAR,TEXT 和 CHARACTER,它们都是 TEXT 列类型的别名,都可以用来存储字符串。
6.sqlite3函数接口
c
int sqlite3_open(const char *filename, sqlite3 **ppDb)
/*
功能:打开一个数据库
参数:filename 数据库路径名,ppDb 数据库操作句柄(指针)
返回值:成功 SQLITE_OK,出错错误码
*/
c
int sqlite3_close(sqlite3 *db)
/*
功能:关闭数据库
参数:db 操作数据库的指针
返回值:成功,SQLITE_OK,出错错误码
*/
c
const char *sqlite3_errmsg(sqlite3 *db)
/*
功能:通过db句柄,得到数据库操作的错误信息
返回值:错误信息的首地址
*/
c
int sqlite3_exec(sqlite3 *db, const char *sql, int (*callback)(void *arg, char **, char**), void *arg, char**errmsg)
/*
功能:执行一条sql语句
参数:db 数据库操作句柄
sql 一条sql语句
callback 回调函数,查询语句时执行
arg 给回调函数的参数
errmsg 错误信息
返回值:成功 SQLITE_OK
*/
c
int (*callback)(void *arg, int, char**, char**)
/*
功能:查询结果,是一个函数指针类型,传递一个函数名即可
*/
7.代码实例
c
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
#define DATABASE "stu.db"
//插入函数
int do_insert(sqlite3 * db)
{
int id;
char name[32] = {};
int score;
char sql[128] = {}; //拼接
char *errmsg;
printf("Input id:");
scanf("%d", &id);
getchar();
printf("Input name:");
scanf("%s", name);
getchar();
printf("Input score:");
scanf("%d", &score);
getchar();
sprintf(sql, "insert into stu values(%d, '%s', %d);", id, name, score); //拼接完成
if(sqlite3_exec(db, sql, NULL, NULL, &errmsg ) != SQLITE_OK)
{
printf("%s\n", errmsg);
}
else
{
printf("Insert done.\n");
}
return 0;
}
//删除函数按照id
int do_delete(sqlite3 * db)
{
int id;
char sql[128] = {}; //拼接
char *errmsg;
printf("Input id:");
scanf("%d", &id);
getchar();
sprintf(sql, "delete from stu where id = %d", id); //拼接完成
if(sqlite3_exec(db, sql, NULL, NULL, &errmsg ) != SQLITE_OK)
{
printf("%s\n", errmsg);
}
else
{
printf("Delete done.\n");
}
return 0;
}
//更新函数按照输入id
int do_update(sqlite3 * db)
{
int id;
char sql[128] = {}; //拼接操作命令
int score;
char *errmsg;
printf("Input update id:");
scanf("%d", &id);
getchar();
printf("Update score:");
scanf("%d", &score);
getchar();
sprintf(sql, "update stu set score = %d where id = %d", score, id); //拼接完成
if(sqlite3_exec(db, sql, NULL, NULL, &errmsg ) != SQLITE_OK)
{
printf("%s\n", errmsg);
}
else
{
printf("Update done.\n");
}
return 0;
}
//查询函数用到的回调函数
int callback(void *para, int f_num, char **f_value, char **f_name)
{
int i = 0;
for(i = 0; i < f_num; i++)
{
printf("%-11s", f_value[i]); //%-11s是格式符,左对齐,右边填充空格
}
putchar(10); //输出码表中ASCII码10对应的字符,也就是换行
return 0;
}
//查询函数
int do_query(sqlite3 *db)
{
char sql[128] = {};
char *errmsg;
sprintf(sql, "select * from stu;"); //查看整张表
if(sqlite3_exec(db, sql, callback, NULL, &errmsg ) != SQLITE_OK)
{
printf("%s\n", errmsg);
}
else
{
printf("Query done.\n");
}
return 0;
}
//查询函数,不使用回调函数
int do_query1(sqlite3 *db)
{
char sql[128] = {};
char *errmsg;
char **resultp; //二级指针取地址
int nrow; //定义一行
int ncloumn; //定义一列
int index;
int i, j;
sprintf(sql, "select * from stu;"); //查看整张表
if(sqlite3_get_table(db, sql, &resultp, &nrow, &ncloumn, &errmsg) != SQLITE_OK)
{
printf("%s", errmsg);
}
else
{
printf("Query done.\n");
}
for(j = 0; j < ncloumn; j++)
{
printf("%-11s ", resultp[j]);
}
putchar(10);
index = ncloumn; //跨过第一行的列开始
for(i = 0; i < nrow; i++)
{
for(j = 0; j < ncloumn; j++)
{
printf("%-11s ", resultp[index++]); //第一行的列都不打
}
putchar(10);
}
return 0;
}
int main(int argc, const char *argv[])
{
sqlite3 * db;
char * errmsg;
int cmd;
if(sqlite3_open(DATABASE, &db) != SQLITE_OK)
{
printf("%s\n",sqlite3_errmsg(db));
return -1;
}
else
{
printf("Open DATABASE success.\n");
}
//创建一张数据库的表格,如果表格存在打印errmsg消息,不进行重复创建操作
if(sqlite3_exec(db, "create table stu (id Integer, name char, score Integer);", NULL, NULL, &errmsg) != SQLITE_OK)
{
printf("%s\n", errmsg);
}
else
{
printf("create table or open success.\n");
}
//输入cmd进行增、删、查、改、退出操作
while(1)
{
printf("********************************\n");
printf("1:insert 2:delete 3:query 4:update 5:quit.\n");
printf("********************************\n");
printf("Input cmd: ");
scanf("%d", &cmd);
getchar(); //吃掉回车,吃掉多余字符
switch(cmd)
{
case 1:
do_insert(db);
break;
case 2:
do_delete(db);
break;
case 3:
//do_query(db); //调用回调函数进行查阅
do_query1(db); //不调用回调函数进行查阅
break;
case 4:
do_update(db);
break;
case 5:
sqlite3_close(db);
exit(0);
default:
printf("Error!\n");
}
}
}
创作不易,一键三连,谢谢支持!!!