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 主要用于处理大规模、高吞吐量、低延迟的消息传递,它是一个轻量级的、功能强大的消息队列系统&…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
