嵌入式开发之SQLite数据库

SQLite是一种轻量级的嵌入式关系型数据库管理系统(RDBMS),它是一个开源项目,实现了自包含、零配置、无服务器的特性。以下是SQLite的详细介绍:

SQLite特点

轻量级:SQLite的代码库极其精简,不需要单独的服务器进程,与应用程序直接集成,因此非常适合于嵌入式设备和移动应用。
零配置:无需进行配置和管理,SQLite数据库就是一个普通的文件,可以直接在应用程序中创建和访问。
无服务器:SQLite没有独立的服务器进程,所有的操作都是在应用程序内部完成,因此不需要单独的管理和维护。
支持标准SQL:SQLite完全支持SQL语言的标准,包括事务、触发器、外键等功能。
跨平台:SQLite可以在各种操作系统上运行,包括Windows、Linux、macOS等。

SQLite架构

核心库:SQLite的核心库实现了SQL解析、查询优化、执行引擎等基本功能,所有的操作都通过核心库完成。
数据库文件:SQLite数据库就是一个文件,其中包含了表结构、数据和索引等信息,可以直接复制、备份和传输。
客户端库:为了方便使用SQLite,通常会有针对各种编程语言的客户端库,例如SQLite3提供了对C语言的支持,同时也有对其他语言的支持,如Python、Java等。

SQLite应用场景

嵌入式设备:由于SQLite的轻量级和零配置特性,它在嵌入式系统中广泛应用,包括智能手机、物联网设备、嵌入式Linux系统等。
移动应用:许多移动应用采用SQLite作为本地数据存储的解决方案,用于存储用户信息、应用设置、离线数据等。
桌面应用:SQLite也可以作为桌面应用程序的后端数据库,用于存储和管理大量的结构化数据。
临时数据存储:有些应用需要临时存储一些数据,而不希望使用复杂的数据库系统,这时SQLite是一个很好的选择。

优缺点

优点:轻量级、零配置、无服务器、跨平台、支持标准SQL等。
缺点:性能可能不如专门的数据库服务器,不适合大规模并发访问和高负载应用。
总的来说,SQLite是一个非常方便、灵活且易于使用的数据库解决方案,特别适合于轻量级应用和嵌入式系统。

在linux安装SQLite
几乎所有版本的 Linux 操作系统都附带 SQLite。使用下面的命令来检查是否已经安装了 SQLite。

$ sqlite3
SQLite version 3.7.15.2 2013-01-09 11:53:05
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>

SQLite数据库的使用

我们可以使用命令行,或者在程序中调用sqlite的C/C++ API实现对数据库的操作。创建一个固定长度的SQLite数据库并实现基本的增删改查功能,

命令行实现

  1. 创建数据库:
    在命令行或程序中创建一个SQLite数据库文件。
sqlite3 mydatabase.db
  1. 创建表:
    在数据库中创建一个表,定义表的结构和字段。在这个例子中,我们创建一个名为records的表,包含一个整型主键id和一个固定长度的文本字段data。
CREATE TABLE records (id INTEGER PRIMARY KEY,data CHAR(100) NOT NULL
);
  1. 插入数据:
    向表中插入一些数据记录。
INSERT INTO records (data) VALUES ('Record 1');
INSERT INTO records (data) VALUES ('Record 2');
  1. 查询数据:
    使用SELECT语句从表中查询数据记录。
SELECT * FROM records;
  1. 更新数据:
    使用UPDATE语句更新表中的数据记录。
UPDATE records SET data = 'Updated data' WHERE id = 1;
  1. 删除数据:
    使用DELETE语句从表中删除数据记录。
DELETE FROM records WHERE id = 2;

C/C++实现

#include <iostream>
#include <sqlite3.h>// 回调函数,用于SELECT查询的结果处理
static int callback(void* data, int argc, char** argv, char** azColName) {int i;std::cout << "---------------------------" << std::endl;for (i = 0; i < argc; i++) {std::cout << azColName[i] << " = " << (argv[i] ? argv[i] : "NULL") << std::endl;}std::cout << "---------------------------" << std::endl;return 0;
}int main() {sqlite3* db;char* errMsg = 0;int rc;// 打开数据库(如果不存在则创建)rc = sqlite3_open("mydatabase.db", &db);if (rc) {std::cerr << "Can't open database: " << sqlite3_errmsg(db) << std::endl;return 0;} else {std::cout << "Opened database successfully" << std::endl;}// 创建表const char* sql_create_table = "CREATE TABLE IF NOT EXISTS records (id INTEGER PRIMARY KEY, data CHAR(100) NOT NULL);";rc = sqlite3_exec(db, sql_create_table, 0, 0, &errMsg);if (rc != SQLITE_OK) {std::cerr << "SQL error: " << errMsg << std::endl;sqlite3_free(errMsg);} else {std::cout << "Table created successfully" << std::endl;}// 插入数据const char* sql_insert = "INSERT INTO records (data) VALUES ('Record 1');""INSERT INTO records (data) VALUES ('Record 2');";rc = sqlite3_exec(db, sql_insert, 0, 0, &errMsg);if (rc != SQLITE_OK) {std::cerr << "SQL error: " << errMsg << std::endl;sqlite3_free(errMsg);} else {std::cout << "Records inserted successfully" << std::endl;}// 查询数据const char* sql_select = "SELECT * FROM records;";rc = sqlite3_exec(db, sql_select, callback, 0, &errMsg);if (rc != SQLITE_OK) {std::cerr << "SQL error: " << errMsg << std::endl;sqlite3_free(errMsg);}// 关闭数据库连接sqlite3_close(db);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/688783.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32中断定时器的使用

使用systimer来产生较为精确的定时&#xff0c;之前使用for循环来产生。 用示例工程时产生错误&#xff0c;原因是调用F103的3种容量器件&#xff0c;需要更换S汇编头函数。 另外在工程设置中&#xff0c;需要把HD设置为MD&#xff0c;重新编译即可成功。

二叉树基础总结

目录 树的定义&#xff1a; 深度和高度&#xff1a; 二叉树 由来 二叉树种类&#xff1a; 满二叉树&#xff1a; 完全二叉树&#xff1a; 严格二叉树&#xff08;Strict Binary Tree&#xff09;&#xff1a; 平衡二叉树&#xff08;Balanced Binary Tree&#xff09;…

DoRA(权重分解低秩适应):一种新颖的模型微调方法

来自&#xff1a;小互 DoRA&#xff08;权重分解低秩适应&#xff09;&#xff1a;一种新颖的模型微调方法 DoRA在LoRA的基础上进一步发展&#xff0c;通过将预训练权重分解为“幅度”和“方向”两个部分进行微调。 这种权重分解方法允许DoRA更精细地控制模型的学习过程&…

如何将shape数据 导入到Postgresql数据库中(单个和批量)

一. 背景 很多时候我们需要将shape数据导入到Postgresql数据库&#xff0c;将数据db化。 本文主要讲解三种方式&#xff1a; 使用QGIS工具导入&#xff08;单个&#xff09;、使用postgresql2 命令工具导入&#xff08;单个&#xff09;、使用python脚本批量导入shape数据&…

基于函数计算AIGC生成图应用

目录 基于函数计算部署AIGC应用的主要步骤 创建Stable Diffusion模型的应用 访问应用实现文字生图 函数的查看与管理 基于函数计算部署AIGC应用的主要步骤 用函数计算实现AIGC只要简单的三步&#xff0c;分别是创建应用、运行应用及查看管理。 创建Stable Diffusion模型的应…

【大厂AI课学习笔记】【2.2机器学习开发任务实例】(3)数据准备和数据预处理

项目开始&#xff0c;首先要进行数据准备和数据预处理。 数据准备的核心是找到这些数据&#xff0c;观察数据的问题。 数据预处理就是去掉脏数据。 缺失值的处理&#xff0c;格式转换等。 延伸学习&#xff1a; 在人工智能&#xff08;AI&#xff09;的众多工作流程中&#…

浏览器url地址栏空格变+号

问题描述&#xff0c;后台返回一个参数携带在url上面&#xff0c;发的时候是空格隔开的字符串&#xff0c;但是到了前端放到地址栏打开是一个号。 类似于 // 后台返回的url https://xxx.com?aaa bxxx // 打开浏览器后地址栏显示的 https://xxx.com?aaabxxx问了一下AI说是空…

k8s ipvs 模式下不支持 localhost:<nodeport>方式访问服务

简介 今天去定位一个nodeport的问题&#xff0c;发现curl 127.0.0.1:32000 访问nodeport的时候会规律的hang住&#xff0c;本来以为是后端服务的问题&#xff0c;但是curl管理ip:nodeport 是正常的。这个就奇怪了&#xff0c;深入研究了下发现 ipvs模式下是不支持这样访问的&a…

Python如何实现定时发送qq消息

因为生活中老是忘记各种事情&#xff0c;刚好又在学python&#xff0c;便突发奇想通过python实现提醒任务的功能&#xff08;尽管TIM有定时功能&#xff09;&#xff0c;也可定时给好友、群、讨论组发送qq消息。其工作流程是&#xff1a;访问数据库提取最近计划——>根据数据…

2024阿里云服务器配置怎么选择?c7、g7和r7?

阿里云服务器配置怎么选择合适&#xff1f;CPU内存、公网带宽和ECS实例规格怎么选择合适&#xff1f;阿里云服务器网aliyunfuwuqi.com建议根据实际使用场景选择&#xff0c;例如企业网站后台、自建数据库、企业OA、ERP等办公系统、线下IDC直接映射、高性能计算和大游戏并发&…

打开ps显示找不到dll怎么办?这四种方法可快速修复

在计算机操作系统中&#xff0c;当执行某程序或运行特定软件时&#xff0c;如果系统提示“ps显示找不到dll文件”&#xff0c;这其实是一个较为常见的问题现象。动态链接库&#xff08;DLL&#xff09;文件是Windows操作系统中不可或缺的重要组件&#xff0c;它包含了大量可被多…

IDEA实现序列化时如何自动生成serialVersionUID

实现步骤&#xff1a;1.安装GenerateSerialVersionUID插件 2.点击idea左上角File -> Settings -> Editor -> Inspections -> 搜索 Serialization issues &#xff0c;找到 Serializable class without ‘serialVersionUID’ ->打上勾&#xff0c;再点击Apply-&…

简单介绍数据结构的基本概念

数据结构的基本概念 常用术语 数据 数据&#xff08;Data&#xff09;是客观事物的符号表示&#xff0c;是所有能输入到计算机中并被计算机程序处理的符号的总称。例如&#xff1a;整数、字符串、图形、图像、声音和动画等 数据元素 数据元素&#xff08;Data Element&…

【软考】软件过程

目录 一、说明二、能力成熟度模型&#xff08;CMM&#xff09;三、能力成熟度模型集成(CMMI)3.1 说明3.2 阶段式模型3.2 连续式模型 一、说明 1.遵循一系列可预测的步骤&#xff08;路线图&#xff09;&#xff0c;有助于及时交付高质量的产品 2.软件开发中所遵循的路线图称为软…

每日OJ题_算法_递归③力扣206. 反转链表

目录 力扣206. 反转链表 解析代码 力扣206. 反转链表 206. 反转链表 LCR 024. 反转链表 难度 简单 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,…

顺子日期 蓝桥杯

调用API 思路: 设置Calendar的属性&#xff0c;获取Calendar的毫秒数&#xff0c;转换成指定格式的字符串(yyyyMMdd)&#xff0c;判断字符串中是否包含符合条件的&#xff0c;若有就1&#xff0c; 迭代: 每次循环给Calendar加上一天即可 import java.text.SimpleDateFormat; im…

Python中的Lambda函数

Python中的Lambda函数 Python中的Lambda函数是一种小型匿名函数&#xff0c;它是通过关键字lambda来定义的。Lambda函数可以接受任意数量的参数&#xff0c;但只能有一个表达式。 Lambda函数的语法 Lambda函数的语法非常简单&#xff0c;基本形式如下&#xff1a; lambda a…

windows_tcp简单代码

文章内容&#xff1a; 一个简单的显示windows平台下ctcp的代码 客户端代码已上传服务器代码未验证方便自己日后使用 客户端&#xff1a; #if _MSC_VER >1600 //VS2010版本号是1600#pragma execution_character_set("utf-8") #endif #include "mynetdump.h&…

【机构内部教程】Jmeter性能测试【一】:性能测试全套教程

性能测试的概念 性能测试是指通过特定方式&#xff0c;对被测系统按照一定策略施加压力&#xff0c;获取系统 响应时间、TPS&#xff08;Transaction Per Second&#xff09;、吞吐量、资源利用率等性能指标&#xff0c;以期保证生产系统的性能能够满足用户需求的过程。 性能…

【漏洞复现-通达OA】通达OA getcallist存在前台SQL注入漏洞

一、漏洞简介 通达OA(Office Anywhere网络智能办公系统)是由北京通达信科科技有限公司自主研发的协同办公自动化软件,是与中国企业管理实践相结合形成的综合管理办公平台。通达OA为各行业不同规模的众多用户提供信息化管理能力,包括流程审批、行政办公、日常事务、数据统计…