sqlite3自动删除数据的两种设置方式记录
文章概要
- 〇、背景
- 一、基本思路
- 1.1 按时间分多文件,限制文件的个数
- 1.2 按时间分数据表,限制表的个数
- 1.3 按记录的时间删除超过规定时间数据,限制记录数据的时间
- 1.4 按记录的数据条数删除多余的数据,限制记录数据的个数
- 二、实现代码
- 三、测试方式
〇、背景
基于嵌入式编程,在实际项目中往往需要记录一些安全数据、或者日志数据、或者状态数据等等,但是由于空间有限或者保存的数据的有限性原因,记录的数据往往也存在保质期,对于已过期的数据自然是采用自动删除策略较为方便,所以本文就提供几种简单的解决方案以供参考。
一、基本思路
1.1 按时间分多文件,限制文件的个数
这种记录方式其实实现比较简单,其实就是设置 时间粒度 生成一个 特定名称 的数据库文件(里面只有一个数据表),按照然后设定的时间(比如1天)删除数据库文件即可。
时间粒度 的设置,可以根据实际每单位时间写入的数据量进行合理的设置。
文件名称 的设置,可以是在基本名称后面加上创建的时间,这样的话方便判断此文件是否过期。
注:
- 此种方式的好处就是如果系统崩溃或者写入数据时程序崩溃,不会影响到其他已经记录的数据库文件。并且,如果需要记录的数据量比较大的话,单个数据库记录文件相对大小稳定,方便文件的管理
- 缺点就是如果时间粒度比较小,或者数据量比较的小的时候,会产生过多的数据库文件,不方便统一查看。
1.2 按时间分数据表,限制表的个数
这种方式与上述的方式大同小异,唯一的区别就是只有一个数据库文件,然后在此数据库文件中根据时间粒度创建不同的数据表,创建数据表的名称也可以参考上述创建数据库的名称的方式。
相较于上述第一种方式,此种方式的优缺点几乎与第一种方式的正好相反。同时其也兼顾了如果时间粒度比较小,或者数据量比较的小的时候,会产生过多的数据表的缺点。
此种方式最为不推荐。
1.3 按记录的时间删除超过规定时间数据,限制记录数据的时间
在记录的数据中,时间往往是一个比较重要的信息,所以此种方式创建的数据表的项中,需要有一个当前数据记录的时间的信息(本例中updatetime 列)正中下怀。可以根据实际记录的时间粒度(或者实际时间的需求)自定义记录时间的格式,然后在创建触发器的时候,根据sqlite3自带的时间转换功能进行时间的转化与计算,然后设置对应的触发条件。
本例中时间的记录采用的是格式是:2024-08-12 11:22:33.456。具体实现可以详见如下的代码。
1.4 按记录的数据条数删除多余的数据,限制记录数据的个数
在想数据库中写入数据的时候,系统自动创建并管理rowid列,其记录的一个信息是当前记录的数据的条数,所以我们可以根据此rowid进行数据库中数据的限制。
具体实现可以详见如下的代码。
二、实现代码
整体实现代码也是比较简单,主要在代码中实现两个触发器设置,然后持续在数据库中写入数据,直到两个 触发器 触发进行数据的删除。比如本例中代码文件的名称为 sqlite_main.c 。详细实现代码如下所示。
代码中注释比较详细此处将不再进行其他说明。
#include "sqlite3.h"
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <time.h>
#include <unistd.h>#define SQLITE_DATABASE_NAME "sqlite3.db" /* 数据库的名称 */
#define SQLITE_TABLE_NAME_AA "table1" /* 数据表11名称 */
#define SQLITE_TABLE_NAME_BB "table2" /* 数据表22名称 */#define SQLTABLECDF_LOG_TIME 0x01U
#define SQLTABLECDF_LOG_NUMS 0x00U
#define SQLTABLECDF_FUN_TIME 0x01U
#define SQLTABLECDF_FUN_NUMS 0x00U#define CFG_SQLTABLE_VALUE_MIN 0U /* 记录最小值 */
#define CFG_SQLTABLE_VALUE_MAX 10000U /* 记录的最大的条数值(默认值) */
#define CFG_SQLTABLE_TIME_MAX 72U /* 记录的时间的最大值(默认值),小时 *//* 定义数据库操作句柄 */
sqlite3 *g_sqlite_db_handle = NULL;typedef enum
{LimitType_ByCount = 0, /* 数量限制 */LimitType_ByTime = 1, /* 时间限制 */
} EnumLimitType;/** @fn Sqlite_TableLimitTypeSet* @brief 设置数据表的限制方式及条件* @param[in] sqlfd 数据库操作句柄* @param[in] tablename 要操作的数据表名称* @param[in] type 操作的限制类型* @param[in] value 操作的限制条件* @param[out] none* @return true 执行成功 false 执行失败*/
bool Sqlite_TableLimitTypeSet(sqlite3 *const sqlfd, const char *const tablename, const EnumLimitType type, const uint32_t value)
{char t_sql_cmd[1024] = {0}, *t_err_msg = NULL;uint32_t t_value = value;if (NULL == sqlfd || NULL == tablename)return false;memset(t_sql_cmd, 0, sizeof(t_sql_cmd));if (LimitType_ByCount == type){/* 参数有效性判断 */if ((value <= CFG_SQLTABLE_VALUE_MIN || value > CFG_SQLTABLE_VALUE_MAX))t_value = CFG_SQLTABLE_VALUE_MAX; /* 设置默认值 *//* 拼接SQL命令字符串 */
相关文章:
sqlite3自动删除数据的两种设置方式记录
文章概要 〇、背景一、基本思路1.1 按时间分多文件,限制文件的个数1.2 按时间分数据表,限制表的个数1.3 按记录的时间删除超过规定时间数据,限制记录数据的时间1.4 按记录的数据条数删除多余的数据,限制记录数据的个数二、实现代码三、测试方式〇、背景 基于嵌入式编程,在…...

Hive分桶超详细!!!
1、分桶的意义 数据分区可能导致有些分区,数据过多,有些分区,数据极少。分桶是将数据集分解为若干部分(数据文件)的另一种技术。 分区和分桶其实都是对数据更细粒度的管理。当单个分区或者表中的数据越来越大,分区不能细粒度的划分数据时,我…...

【深度学习之回归预测篇】 深度极限学习机DELM多特征回归拟合预测(Matlab源代码)
深度极限学习机 (DELM) 作为一种新型的深度学习算法,凭借其独特的结构和训练方式,在诸多领域展现出优异的性能。本文将重点探讨DELM在多输入单输出 (MISO) 场景下的应用,深入分析其算法原理、性能特点以及未来发展前景。 1、 DELM算法原理及其…...

Android mk/bp构建工具介绍
零. 前言 由于Bluedroid的介绍文档有限,以及对Android的一些基本的知识需要了(Android 四大组件/AIDL/Framework/Binder机制/JNI/HIDL等),加上需要掌握的语言包括Java/C/C等,加上网络上其实没有一个完整的介绍Bluedroid系列的文档࿰…...
数据源及分层开发
数据源及分层开发 1. 使用Tomcat数据源 连接池工作原理: 连接池是由容器提供的,用来管理池中连接对象。 连接池自动分配连接对象并对闲置的连接进行回收。 数据源(DataSource): javax.sql.DataSource接口负责建立…...

气膜场馆照明设计:科技与环保的完美结合—轻空间
气膜场馆的照明设计,选用高效节能的400瓦LED灯具,结合现代节能技术,提供强大而均匀的光照。LED灯具在光效和寿命方面优势显著,不仅降低运营能耗,还有效减少碳排放,为绿色场馆建设贡献力量。 科学分布&…...

并行IO接口8255
文章目录 8255A芯片组成外设接口三个端口两组端口关于C口(★) 内部逻辑CPU接口 8255A的控制字(★)位控字(D70)方式选择控制字(D71) 8255A的工作方式工作方式0(基本输入/输…...

Level DB --- SkipList
class SkipList class SkipList 是Level DB中的重要数据结构,存储在memtable中的数据通过SkipList来存储和检索数据,它有优秀的读写性能,且和红黑树相比,更适合多线程的操作。 SkipList SkipList还是一个比较简单的数据结构&a…...

第二十二周机器学习笔记:动手深度学习之——线性代数
第二十周周报 摘要Abstract一、动手深度学习1. 线性代数1.1 标量1.2 向量1.3 矩阵1.4 张量1.4.1 张量算法的基本性质 1.5 降维1.5.1 非降维求和 1.6 点积1.6.1 矩阵-向量积1.6.2 矩阵-矩阵乘法 1.7 范数 总结 摘要 本文深入探讨了深度学习中的数学基础,特别是线性代…...
leetcode 50个简单和中等难度的题
简单难度题目(25个) 两数之和 (Two Sum)有效的括号 (Valid Parentheses)罗马数字转整数 (Roman to Integer)最长公共前缀 (Longest Common Prefix)合并两个有序链表 (Merge Two Sorted Lists)移除链表元素 (Remove Linked List E…...

多模态大模型(5)--LLaVA
人类通过如视觉、语言、听觉等多种渠道与世界互动,每个单独的渠道在表示和传达某些概念时都有其独特的优势,人工智能(AI)的一个核心愿景是开发一个能够有效遵循多模态视觉和语言指令的通用助手,与人类意图一致…...

Vue实训---3-element plus的使用与布局
1.引入ElementPlus ElementPlus官网指南:快速开始 | Element Plus 在我们的项目main.js文件中,加入红框里的内容: import { createApp } from vue import App from ./App.vue // 引入全局样式,是对样式的初始化 import "/a…...

TritonServer中加载模型,并在Gunicorn上启动Web服务调用模型
TritonServer中加载模型,并在Gunicorn上启动Web服务调用模型 一、TritonServer中加载模型1.1 搭建本地仓库1.2 配置文件1.3 服务端代码1.4 启动TritonServer二、Gunicorn上启动Web服务2.1 安装和配置Gunicorn2.2 启动Gunicorn三、调用模型四、性能优化与监控五、总结在深度学习…...
快速删除 node_modules 目录的集中方法
要快速删除 node_modules 目录,可以使用以下几种方法: 方法 1: 使用 rimraf 如果你在 Windows 上或者想要一个跨平台的解决方案,可以使用 rimraf 这个工具,它是 Node.js 版本的 rm -rf。 安装 rimraf: npm install …...
shell编程--if判断与for循环
shell编程与其他编程语言一样都有if判断与循环,今天了解一下if判断语句和for循环语句。 if判断语句讲解 我们写出一个if判断 a 1 b 2if [ "$a" -eq "$b" ]; thenecho "相等" elseecho "不相等" fi 在shell中-eq是表示…...

Makefile基础应用
1 使用场景 在Linux环境下,我们通常需要通过命令行来编译代码。例如,在使用gcc编译C语言代码时,需要使用以下命令。 gcc -o main main.c 使用这种方式编译代码非常吃力,每次调试代码都需要重新在命令行下重新编译,重复…...

计算机网络基础全攻略:探秘网络构建块(1/10)
一、计算机网络基础概念 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路和通信设备连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统…...
SpringMVC-Day1
SpringMVC 1.SpringMVC介绍 springMVC是一种基于Java实现MVC模型的轻量级Web框架 优点: 使用简单,开发便捷(相较于Servelt) 灵活性强 使用SpringMVC技术开发web程序流程 创建web工程(Maven结构) 设置…...

【虚拟机】VMWare的CentOS虚拟机断电或强制关机出现问题
VMware 虚拟机因为笔记本突然断电故障了,开机提示“Entering emergency mode. Exit the shell to continue.”,如下图所示: 解决方法:输入命令: xfs_repair -v -L /dev/dm-0 注:报 no such file or direct…...

探索 RocketMQ:企业级消息中间件的选择与应用
一、关于RocketMQ RocketMQ 是一个高性能、高可靠、可扩展的分布式消息中间件,它是由阿里巴巴开发并贡献给 Apache 软件基金会的一个开源项目。RocketMQ 主要用于处理大规模、高吞吐量、低延迟的消息传递,它是一个轻量级的、功能强大的消息队列系统&…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...