当前位置: 首页 > news >正文

Linux 软件编程(十四)网络编程:数据存储与 SQLite 数据库

一、数据存储方式分类

(一)内存存储

  • 载体:变量、数组、各类数据存储结构等都存储在内存中。
  • 特点:程序运行时数据可快速访问,但掉电或程序运行结束后,数据会丢失,无法持久保存。

(二)硬盘存储

  • 载体:文件、数据库等存储在硬盘上。
  • 特点掉电或程序运行结束后,数据不会丢失,能实现持久化存储。

二、常用数据库分类

(一)关系型数据库

  • 原理:将复杂数据结构简化为二维表格形式,通过表与表之间的关联(如主键、外键)组织数据。
  • 代表产品
    • 大型:Oracle、DB2,适用于企业级大规模数据管理场景。
    • 中型:MySQL、SQL Server,在中小型企业及 Web 应用中广泛使用。
    • 小型:SQLite,轻量且嵌入式,适合资源受限或简单数据存储场景。

(二)非关系型数据库

  • 原理:以键值对形式存储数据,数据结构不固定,灵活度高。
  • 代表产品:Redis(高性能缓存与键值存储)、MongoDB(文档型数据库,适合 JSON 类数据)等。

三、SQLite 数据库核心特性与安装

(一)核心特性

  1. 开源免费:基于 C 语言开发,完全开源且免费使用。
  2. 轻量小巧:代码量仅约 1 万行,总大小在 10M 以内,嵌入性极强。
  3. 跨平台易移植:属于文件型数据库,数据库文件可轻松移动,跨平台移植性出色。
  4. 大容量支持:理论上数据容量最大可达 2T,能满足多数中小规模数据存储需求。

(二)安装步骤(以 Ubuntu 为例)

  1. 安装 SQLite3:( sqlite3.22.0)

    bash

    sudo apt-get install sqlite3
    
  2. 安装相关开发库(便于后续 C/C++ 开发):

    bash

    sudo apt-get install libsqlite3-dev
    
  3. 测试安装:创建名为 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.dbxxx.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;) 语句时,每查到一条数据就会调用一次该回调函数。
  • 参数:
    • argsqlite3_exec 传递的第四个参数。
    • column:查询到的数据的列数。
    • column_values:指针数组,每个指针指向对应列数据的字符串。
    • column_name:指针数组,多个指针指向每一列的列名。
  • 注意:回调函数成功需返回 0,否则会提示 sqlite3_exec error : query aborted;从数据库查询出的数据均为字符串类型。

六、总结

数据存储是程序开发的重要环节,内存存储适合临时数据,硬盘存储(文件、数据库)保障数据持久化。SQLite 作为轻量型关系数据库,凭借开源免费、跨平台、易嵌入等特性,成为众多场景的优选。

http://www.xdnf.cn/news/1385569.html

相关文章:

  • 【C++】类与对象(上)
  • Python- Visual Studio Code配置Anaconda
  • Vue 实战:优雅实现无限层级评论区,支持“显示全部”分页递归加载
  • simd笔记
  • 使用生成对抗网络增强网络入侵检测性能
  • 【开题答辩全过程】以 基于Python的美食点评系统为例,包含答辩的问题和答案
  • 【数据结构与算法-Day 20】从零到一掌握二叉树:定义、性质、特殊形态与存储结构全解析
  • Hadoop(六)
  • T06_循环神经网络
  • 基于博客系统的自动化测试项目
  • Selenium无法定位元素的几种解决方案
  • C# 日志写入loki
  • 力扣452:用最少数量的箭射爆气球(排序+贪心)
  • 如何编译和使用 tomcat-connectors-1.2.32 源码(连接 Apache 和 Tomcat)​附安装包下载
  • 数据质检之springboot通过yarn调用spark作业实现数据质量检测
  • Dify 1.8.0 全网首发,预告发布
  • 2024-06-13-debian12安装Mariadb-Galera-Cluster+Nginx+Keepalived高可用多主集群
  • 动态UI的秘诀:React中的条件渲染
  • 在PostgreSQL中使用分区技术
  • 【三维渲染技术讨论】Blender输出的三维文件里的透明贴图在Isaac Sim里会丢失, 是什么原因?
  • Blender建模软件基本操作--学习笔记1
  • 查看docker容器内部的环境变量并向docker容器内部添加新的环境变量
  • 第十二节 Spring 注入集合
  • 微服务Eureka组件的介绍、安装、使用
  • 编程与数学 03-004 数据库系统概论 06_需求分析
  • CMake xcode编译器属性设置技巧
  • PDF转图片工具实现
  • R 语言 + 卒中 Meta 分析(续):机器学习 Meta 与结构方程 Meta 完整实现
  • 生成式 AI 的下一个风口:从 “生成内容” 到 “生成工具”,如何落地产业场景?
  • android 不同分辨图片放错对应文件夹会怎样?