Linux 软件编程(十四)网络编程:数据存储与 SQLite 数据库
一、数据存储方式分类
(一)内存存储
- 载体:变量、数组、各类数据存储结构等都存储在内存中。
- 特点:程序运行时数据可快速访问,但掉电或程序运行结束后,数据会丢失,无法持久保存。
(二)硬盘存储
- 载体:文件、数据库等存储在硬盘上。
- 特点:掉电或程序运行结束后,数据不会丢失,能实现持久化存储。
二、常用数据库分类
(一)关系型数据库
- 原理:将复杂数据结构简化为二维表格形式,通过表与表之间的关联(如主键、外键)组织数据。
- 代表产品:
- 大型:Oracle、DB2,适用于企业级大规模数据管理场景。
- 中型:MySQL、SQL Server,在中小型企业及 Web 应用中广泛使用。
- 小型:SQLite,轻量且嵌入式,适合资源受限或简单数据存储场景。
(二)非关系型数据库
- 原理:以键值对形式存储数据,数据结构不固定,灵活度高。
- 代表产品:Redis(高性能缓存与键值存储)、MongoDB(文档型数据库,适合 JSON 类数据)等。
三、SQLite 数据库核心特性与安装
(一)核心特性
- 开源免费:基于 C 语言开发,完全开源且免费使用。
- 轻量小巧:代码量仅约 1 万行,总大小在 10M 以内,嵌入性极强。
- 跨平台易移植:属于文件型数据库,数据库文件可轻松移动,跨平台移植性出色。
- 大容量支持:理论上数据容量最大可达 2T,能满足多数中小规模数据存储需求。
(二)安装步骤(以 Ubuntu 为例)
- 安装 SQLite3:( sqlite3.22.0)
bash
sudo apt-get install sqlite3
- 安装相关开发库(便于后续 C/C++ 开发):
bash
sudo apt-get install libsqlite3-dev
- 测试安装:创建名为
xxx.db
的数据库,在终端执行:bash
sqlite3 xxx.db
四、SQLite 数据库基础操作
(一)常用命令
在 SQLite 命令行中,可通过以下命令辅助操作:
.help
:查看支持的命令。.tables
:查看当前数据库中的表。.headers on/off
:打开或隐藏查询结果的表头。.mode column
:设置查询结果列左对齐。.quit
:退出数据库。
sqlite支持的数据类型:
NULL : 空值
INTEGER : 整形
REAL: 浮点型
TEXT: 字符串类型
BLOB: 根据输入进行存储
(二)SQL 语句操作
SQLite 支持标准 SQL 语句,需注意:SQL 语句以分号 ;
结尾,且 SQLite 不区分大小写。
1. 创建表
语法:create table 表名(列名1 数据类型, 列名2 数据类型, 列名3 数据类型);
示例:创建一个包含学生学号、姓名、年龄、成绩的表 class1
:
create table class1(id INTEGER, name TEXT, age INTEGER, score REAL);
2. 插入数据
语法:insert into 表名 values(值1, 值2, 值3);
示例:向 class1
插入一条学生数据:
insert into class1 values(1, "zhangsan", 19, 88.5);
3. 查询数据
- 查询所有列数据:
select * from 表名;
示例:查询class1
所有数据:sql
select * from class1;
- 查询指定列数据:
select 列名1, 列名2, 列名n from 表名;
示例:查询class1
中学生的姓名和成绩:sql
select name, score from class1;
- 条件查询:
select * from 表名 where 列 条件;
关系运算符:>
、<
、>=
、<=
、=
、!=
,逻辑运算符and
(&&)、or
(||)。
示例:查询class1
中成绩大于 80 的学生:sql
select * from class1 where score > 80;
- 模糊查找(字符串):
%
:模糊匹配多个字符;_
:模糊匹配一个字符。
示例 1:查询姓名以 “梅” 结尾的学生:
sql
select * from 表名 where 列 like "%梅";
示例 2:查询姓名第二个字是 “梅” 的学生(假设姓名为三个字):
sql
select * from 表名 where 列 like "_梅_";
- 排序查找:
- 升序排序:
select * from 表名 order by 列名 ASC;
- 降序排序:
select * from 表名 order by 列名 DESC;
示例:按成绩降序查询class1
学生:
sql
select * from class1 order by score DESC;
- 升序排序:
4. 删除数据
语法:delete from 表名 where 删除的条件;
示例:删除 class1
中成绩小于 80 的学生:
sql
delete from class1 where score < 80;
5. 修改数据
语法:update 表名 set 列=新值 where 条件;
示例:将 class1
中姓名为 “wanger” 的学生成绩改为 100:
sql
update class1 set score=100 where name="wanger";
6. 删除表
语法:drop table 表名;
示例:删除 class1
表:
sql
drop table class1;
7. 设置主键自动增长列
- 要求:主键自动增长列必须是
INTEGER
类型,创建表时需添加PRIMARY KEY AUTOINCREMENT
。 - 示例:创建表
class2
,学号id
为主键且自动增长:
sql
create table class2(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, score REAL);
- 插入数据时,主键列传
NULL
即可自动增长:
sql
insert into class2 values(NULL, "张三", 90);
8. 时间相关操作
- 获取当前日期:
date("now");
(格式:年 - 月 - 日)。 - 获取当前时间(含时区调整,如 +8 小时):
datetime("now", "+8 hours");
(格式:年 - 月 - 日 时:分:秒)。
(三)可视化工具
可通过以下命令安装 SQLite 可视化工具 sqlitebrowser
,方便图形化操作数据库:
bash
sudo apt-get install sqlitebrowser
使用时,执行 sqlitebrowser xxx.db
(xxx.db
为目标数据库文件)即可打开。
五、SQLite C/C++ API
SQLite 提供了简洁的 C/C++ API,便于在程序中操作数据库。
(一)打开与关闭数据库
打开数据库:
int sqlite3_open(const char *filename, /* 数据库文件名(UTF-8 编码) */sqlite3 **ppDb /* 输出:SQLite 数据库句柄指针 */ );
- 功能:打开指定数据库文件。
- 返回值:成功返回
SQLITE_OK
,失败返回错误码。
关闭数据库:
int sqlite3_close(sqlite3 *db);
- 功能:关闭数据库连接。
(二)执行 SQL 语句
c
运行
int sqlite3_exec(sqlite3 *pdb, /* 已打开的数据库句柄 */const char *sql, /* 要执行的 SQL 语句 */int (*callback)(void*,int,char**,char**), /* select 语句的回调函数 */void *arg, /* 传递给回调函数的参数(实参) */char **errmsg /* 保存出错信息 */
);
- 功能:执行 SQL 语句。
- 返回值:成功返回
SQLITE_OK
,失败返回错误码。
(三)回调函数(处理 select 结果)
int (*callback)(void *arg, int column, char **column_values, char **column_name);
- 功能:执行
select(select * from class1;)
语句时,每查到一条数据就会调用一次该回调函数。 - 参数:
arg
:sqlite3_exec
传递的第四个参数。column
:查询到的数据的列数。column_values
:指针数组,每个指针指向对应列数据的字符串。column_name
:指针数组,多个指针指向每一列的列名。
- 注意:回调函数成功需返回 0,否则会提示
sqlite3_exec error : query aborted
;从数据库查询出的数据均为字符串类型。
六、总结
数据存储是程序开发的重要环节,内存存储适合临时数据,硬盘存储(文件、数据库)保障数据持久化。SQLite 作为轻量型关系数据库,凭借开源免费、跨平台、易嵌入等特性,成为众多场景的优选。