【sqlite3】网络socket编程温度采集智能存储与上报项目技术------sqlite3数据库基础

作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生在读,研究方向无线联邦学习
擅长领域:驱动开发,嵌入式软件开发,BSP开发
作者主页:一个平凡而乐于分享的小比特的个人主页
文章收录专栏:网络socket编程之温度采集智能存储与上报项目,本专栏为网络socket编程之温度采集智能存储与上报项目技术简介,实现流程分析
项目源码:https://gitee.com/TJF865975/project1_ds18b20,README部分包含项目功能及实现,欢迎大家Watch、Star、Fork。
欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖

1.sqlite3简介

SQLite3是一种轻量级的关系型数据库,可以在本地磁盘上存储数据。

2.sqlite3安装

sudo apt-get install sqlite3

3.系统命令

.help			//帮助
.quit			//退出
.exit			//退出
.schema			//查看表的结构图

4.sqlite3使用

4.1 打开数据库

使用命令行工具或SQLite客户端工具打开一个SQLite数据库文件,如:

sqlite3 mydatabase.db

如果文件不存在,则会自动创建一个新的数据库文件。

4.2 创建表格

使用CREATE TABLE命令创建一个新的表格,例如:

CREATE TABLE users ( id INTEGER PRIMARY KEY, name TEXT, age INTEGER );

上述语句创建了一个名为"users"的表格,其中包含三个列:id、name和age。

4.3 插入数据

使用INSERT INTO命令插入新的数据行,例如:

INSERT INTO users (name, age) VALUES ('Alice', 25);

上述语句将一行新的数据插入到"users"表格中,包含两个列:name和age,其中name为"Alice",age为25。

4.4 查询数据

使用SELECT语句查询表格中的数据行,例如:

SELECT * FROM users;

上述语句将返回"users"表格中的所有数据行。

4.5 更新数据

使用UPDATE语句更新表格中的数据行,例如:

UPDATE users SET age = 26 WHERE name = 'Alice';

上述语句将更新"users"表格中名为"Alice"的行的age列为26。
如果您想要修改SQLite数据库中某段数据的某个值,可以使用UPDATE语句。

UPDATE语句允许您更新一个或多个列的值,可以使用WHERE子句来指定要更新的特定行。下面是一个基本的UPDATE语句的语法:

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,可以使用以下语句:

UPDATE users SET email = 'new_email@example.com' WHERE id = 1;

注意,如果没有WHERE子句,则将更新所有行。因此,请确保在更新数据之前指定WHERE子句,以便只更新您要更新的特定行。

4.6 删除数据

使用DELETE FROM语句删除表格中的数据行,例如:

DELETE FROM users WHERE name = 'Alice';

上述语句将删除"users"表格中名为"Alice"的行。
在 SQLite 中,删除数据的方式有以下几种:

  1. 使用 DELETE 语句删除单个或多个行。
  2. 使用 DROP TABLE 语句删除整个表。
  3. 使用 TRUNCATE TABLE 语句删除整个表的所有行。
  4. 使用 VACUUM 命令回收未使用的空间,从而删除已删除行占用的空间。
    以下是每种方式的详细说明:

4.6.1 DELETE 语句

使用 DELETE 语句删除单个或多个行:

DELETE FROM tableName WHERE condition;

其中,tableName 是要删除数据的表名,condition 是 WHERE 子句中的条件,指定要删除的行。如果 WHERE 子句为空,则将删除表中的所有行。

4.6.2 DROP TABLE 语句

使用 DROP TABLE 语句删除整个表:

DROP TABLE tableName;

其中,tableName 是要删除的表名。

注意:使用 DROP TABLE 将完全删除表,包括表结构和数据,因此在使用此语句之前,请确认您是否真的要删除整个表。

4.6.3 TRUNCATE TABLE 语句

使用 TRUNCATE TABLE 语句删除整个表的所有行:

TRUNCATE TABLE tableName;

其中,tableName 是要清空数据的表名。

注意:TRUNCATE TABLE 与 DELETE 不同,它将删除表中的所有行,但不删除表本身,也不返回被删除的行数。此外,TRUNCATE TABLE 不触发表的 DELETE 或 UPDATE 触发器。

4.6.4 VACUUM 语句

使用 VACUUM 命令回收未使用的空间,从而删除已删除行占用的空间:

VACUUM;

VACUUM 命令将重新组织表的物理存储,回收未使用的空间,并将被删除的行从表中完全删除。这可以使数据库文件更小,因为它将未使用的空间释放给操作系统。

4.7关闭数据库

关闭数据库 使用.exit命令或者关闭SQLite客户端工具来关闭数据库连接。
以上是SQLite3的基本用法和语法。实际使用时,可以通过SQLite的C/C++ API或者其他编程语言的SQLite封装库来与SQLite数据库进行交互。

5.sqlite数据类型

SQLite 支持以下数据类型:

  1. NULL:空值。
  2. INTEGER:带符号整数,包括 1、2、3、4、6 或 8 个字节,取决于值的大小。
  3. REAL:浮点数,存储为 8 字节的 IEEE 浮点数。
  4. TEXT:字符串,采用编码方式存储。
  5. BLOB:二进制数据,存储为输入的内容。

VARCHAR 是一种在关系数据库中常见的列类型,也是 SQLite 中的列类型之一。它用于存储可变长度的字符串。与 CHAR 类型不同,VARCHAR 类型只使用存储所需的空间,不会预分配固定的空间。VARCHAR 的最大长度取决于数据库的限制,通常为 65535 个字符。

在 SQLite 中,VARCHAR 列类型可以用 TEXT 类型代替,因为它们是同义词,实际上没有任何区别。例如,以下两个定义是等价的:

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函数接口

int sqlite3_open(const char *filename, sqlite3 **ppDb)
/*
 功能:打开一个数据库
 参数:filename 数据库路径名,ppDb 数据库操作句柄(指针)
 返回值:成功 SQLITE_OK,出错错误码
*/

int sqlite3_close(sqlite3 *db)
/*
 功能:关闭数据库
 参数:db 操作数据库的指针
 返回值:成功,SQLITE_OK,出错错误码
*/
const char *sqlite3_errmsg(sqlite3 *db)
/*
 功能:通过db句柄,得到数据库操作的错误信息
 返回值:错误信息的首地址
*/
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
*/
int (*callback)(void *arg, int, char**, char**)
/*
 功能:查询结果,是一个函数指针类型,传递一个函数名即可
*/

7.代码实例

#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");		
		}
	}	
}

创作不易,一键三连,谢谢支持!!!

相关推荐

  1. 数据库SQLite3 中文存储

    2024-04-06 14:20:02       29 阅读
  2. 【C语言数据库Sqlite3基础介绍

    2024-04-06 14:20:02       37 阅读
  3. QtSqlite3

    2024-04-06 14:20:02       62 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-06 14:20:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-06 14:20:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-06 14:20:02       82 阅读
  4. Python语言-面向对象

    2024-04-06 14:20:02       91 阅读

热门阅读

  1. 【数据结构】串

    2024-04-06 14:20:02       37 阅读
  2. 达梦体系结构:进程架构

    2024-04-06 14:20:02       30 阅读
  3. 设计模式:观察者模式示例

    2024-04-06 14:20:02       40 阅读
  4. 算法复习|修剪二叉搜索树

    2024-04-06 14:20:02       41 阅读
  5. 单片机学习day1

    2024-04-06 14:20:02       37 阅读
  6. 反转链表(leetcode 206)

    2024-04-06 14:20:02       36 阅读
  7. LeetCode207、210 课程表(图 dfs 拓扑排序)

    2024-04-06 14:20:02       40 阅读
  8. git 如何删除本地和远程分支

    2024-04-06 14:20:02       36 阅读