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

基于嵌入式Linux的数据库

数据库

数据库是在数据库管理系统和控制之下,存放在存储 介质上的数据集合。

基于嵌入式的数据库

基于嵌入式linux的数据库主要有SQlite,

Firebird,Berkeley DB,eXtremeDB

        Firebird是关系型数据库,功能强大,支持存储过 程,SQL兼容等

        SQlite关系型数据库体积小,支持ACID事务

        Berkeley DB中并没有数据库服务器的概念,它的程 序直接链接到应用程序中

        eXtremeDB是内存数据库,运行效率高

SQlite基础

SQLite的源码是C语言,其源代码完全开发,SQLite

第一个Alpha版本诞生于2000年5月,他是一个轻量 级的嵌入式数据库。

SQLite有以下特性 零配置,无需安装和管理配置 存储在单一磁盘文件中的一个完整的数据库 数据库文件可以在不同字节顺序的机器间自由共享支持数据库大小至2TB

足够小,全部源码大致三万行C代码,250KB

比目前留下的大多数数据库对数据的操作更快

创建数据库

1.在线安装

sudo apt-get install sqlite3

2.本地安装

官网下载sqlite3,然后本地安装:sudo dpkg -i *.deb

3.SQlite3 基本命令

1.系统命令 以 . 开头的命令

        .help 帮助

        .quit 退出

        .schema查看表结构

        .databases 查看打开的数据库

        .table 

2.sql命令

基本的sql命令,不以 . 开头,但是都要 结尾

创建一张数据库的表

        stucreate table stu(id Integer,name char,score Integer);

插入一张记录

        insert into stu values(1001,'zhangsan',80);

插入部分字段记录

        insert into stu(name,score) values(1002,'lisi');

查询所有记录

        select *from stu

查询数据库部分内容字段

        select name,score from stu

根据属性查询

        select * from stu where score=80; select *from stu where score=80 and name='zhangsan';

删除一条记录

        delede from stu where id=1003; delete from stu where socre='90';

更新一条记录

        update stu set name='wangwu' where id=1001; update stu set name='wangwu',score=88 where id = 1001;

添加一列

        alter table stu add column address char;

删除一列

1.创建一张表 提取字段

create table stu1 as select id,name,score from stu;

2.删除原有表

drop table stu;

3.将新的表的名字改成原有的表名字

alter table stu1 rename to stu;

SQlite编程接口

4.API操作

1.int sqlite3_open(char *filename,sqlite3 **db)

        功能:打开sqlite数据库 参数:

        filename:数据库文件路径

        db:指向sqlite句柄的指针

返回值:

        成功返回0,失败返回错误码(非0值)

2.int sqlite3_close(sqlite3 *db);

        功能:关闭sqlite数据库 参数:

        db 操作数据库的指针

返回值:

               成功返回0,失败返回错误码

3.const char *sqlite3_errmsg(sqlite3 *db);

        功能:通过DB句柄得到数据库操作的错误信息

参数:

        db 操作数据库的指针       

        返回值: 返回错误信息的首地址

4.int sqlite3_exec(const char *sql, int (*callback)(void *,int,char**,char *8) void *, char **errmsg);

        功能:执行一条sql语句

参数

        db:数据库操作句柄

        sql:一条sql语句

        sqlite3*db,

        callback:回调函数,只有sql为查询语句的时候, 才会执行此语句

        void * :给回调函数传递参数

        errmsg:错误信息

返回值:

        成功:SQLITE_OK

int (*callback)(void *,int,char**,char *8)

        功能:查询结果,是一个函数指针类型,传递一个函数名

回调函数接口:

typedef int(*sqlite3_callback)( void *para, int f_num, char ** f_value, char ** f_name)

        功能: 每找到一条记录自动执行一次回调函数

        para:传递给回调函数的参数

        f_num:记录中包含的字段数目

        f_value:包含每个字段值的指针数组

        f_name:包含每个字段名称的指针数组

返回值,

        成功返回0,失败返回-1

不使用回调函数执行SQL语句

int sqlite3_get_table( sqlite3 *db, const char *sql, char ***resultp,int *nrow, int *ncolumu,char **errmsg)

        功能:执行sql操作

        db:数据库句柄

        sql:sql语句

        resultp:用来指向sql执行结果的指针

        nrow:满足条件的记录的数目

        ncolumn:每条记录包含的字段数目

        errmsg:错误信息指针的地址

返回值:

        成功返回0,失败返回错误码

#include <stdio.h>  
#include <stdlib.h>  
#include <sqlite3.h>  // sqlite3_callback 类型的回调函数  
int callback(void *NotUsed, int argc, char **argv, char **azColName){  int i;  for(i = 0; i<argc; i++){  printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");  }  printf("\n");  return 0;  
}  int main() {  sqlite3 *db;  char *err_msg = 0;  int rc;  char **result;  int row, column;  // 打开数据库  rc = sqlite3_open("test.db", &db);  if (rc) {  fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));  return 1;  }  // 使用 sqlite3_exec 和回调函数  rc = sqlite3_exec(db, "SELECT * FROM my_table", callback, 0, &err_msg);  if (rc != SQLITE_OK ){  fprintf(stderr, "SQL错误: %s\n", err_msg);  sqlite3_free(err_msg);  sqlite3_close(db);  return 1;  }  // 使用 sqlite3_get_table 获取结果  rc = sqlite3_get_table(db, "SELECT * FROM my_table", &result, &row, &column, &err_msg);  if (rc != SQLITE_OK) {  fprintf(stderr, "SQL错误: %s\n", err_msg);  sqlite3_free(err_msg);  sqlite3_close(db);  return 1;  }  // 输出 sqlite3_get_table 的结果  printf("sqlite3_get_table 结果:\n");  for (int i = 0; i < row + 1; i++) {  for (int j = 0; j < column; j++) {  printf("%s ", result[i*column + j] ? result[i*column + j] : "NULL");  }  printf("\n");  }  // 释放结果  sqlite3_free_table(result);  // 关闭数据库  sqlite3_close(db);  return 0;  
}

相关文章:

基于嵌入式Linux的数据库

数据库 数据库是在数据库管理系统和控制之下&#xff0c;存放在存储 介质上的数据集合。 基于嵌入式的数据库 基于嵌入式linux的数据库主要有SQlite&#xff0c; Firebird,Berkeley DB,eXtremeDB Firebird是关系型数据库&#xff0c;功能强大&#xff0c;支持存储过 程&…...

C# 使用LINQ找出一个子字符串在另一个字符串中出现的所有位置

一、实现步骤 遍历主字符串&#xff0c;使用IndexOf方法查找子字符串的位置。如果找到了子字符串&#xff0c;记录其位置&#xff0c;并且从该位置的后面继续查找。重复上述步骤直到遍历完整个字符串。 二、简单代码示例 using System; using System.Collections.Generic; usi…...

YOLOv8添加MobileViTv3模块(代码+free)

目录 一、理由 二、方法 &#xff08;1&#xff09;导入MobileViTv3模块 &#xff08;2&#xff09;在ultralytics/nn/tasks.py的函数parse_model中修改 &#xff08;3&#xff09;在yaml配置文件中写入 &#xff08;4&#xff09;开始训练&#xff0c;先把其他梯度关闭&…...

从概念到落地:全面解析DApp项目开发的核心要素与未来趋势

随着区块链技术的迅猛发展&#xff0c;去中心化应用程序&#xff08;DApp&#xff09;逐渐成为Web3时代的重要组成部分。DApp通过智能合约和分布式账本技术&#xff0c;提供了无需信任中介的解决方案&#xff0c;这种去中心化的特性使其在金融、游戏、社交等多个领域得到了广泛…...

仓颉编程入门 -- 泛型概述 , 如何定义泛型函数

泛型概述 , 如何定义泛型函数 1 . 泛型的定义 在仓颉编程语言中&#xff0c;泛型机制允许我们定义参数化类型&#xff0c;这些类型在声明时不具体指定其操作的数据类型&#xff0c;而是作为类型形参保留&#xff0c;待使用时通过类型实参来明确。这种灵活性在函数和类型声明中…...

SOC估算方法之(OCV-SOC+安时积分法)

一、引言 此方法主要参考电动汽车用磷酸铁锂电池SOC估算方法这篇论文 总结&#xff1a; 开路电压的测量需要将电池静止相当长的一段时间才能达到平衡状态进行测量。 安时积分法存在初始SOC的估算和累积的误差。 所以上述两种方法都存在一定的缺陷&#xff0c;因此下面主要讲…...

指针(下)

文章目录 指针(下)野指针、空指针野指针空指针 二级指针**main**函数的原型说明 常量指针与指针常量常量指针指针常量常量指针常量 动态内存分配常用函数**malloc****calloc****realloc****free** **void**与**void***的区别扩展&#xff1a;形式参数和实际参数的对应关系 指针…...

C# 浅谈IEnumerable

一、IEnumerable 简介 IEnumerable 是一个接口&#xff0c;它定义了对集合进行迭代所需的方法。IEnumerable 接口主要用于允许开发者使用foreach循环来遍历集合中的元素。这个接口定义了一个名为 GetEnumerator 的方法&#xff0c;该方法返回一个实现了 IEnumerator 接口的对象…...

mmdebstrap:创建 Debian 系统 chroot 环境的利器 ️

文章目录 mmdebstrap 的一般性参数说明 &#x1f4dc;mmdebstrap 的常见用法示例 &#x1f308;使用 mmdebstrap 的注意事项 ⚠️ &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f388;欢迎踏入我的博客世界&#xff0c;能与您在此邂逅&#xff0c;真是缘分使然&am…...

【Linux SQLite数据库】一、SQLite交叉编译与移植

SQLite 是一个用 C 语言编写的开源、轻量级、快速、独立且高可靠性的 SQL 数据库引擎&#xff0c;它提供了功能齐全的数据库解决方案。SQLite 几乎可以在所有的手机和计算机上运行&#xff0c;它被嵌入到无数人每天都在使用的众多应用程序中。此外&#xff0c;SQLite 还具有稳定…...

每天写两道(数组篇)移除元素、

27.移除元素 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k&#xff0c;要通过此题&#xff0c;您需要执行以下操作&#…...

Unity 使用 NewtonSoft Json插件报错

JsonReaderException: Unexpected character encountered while parsing value: . Path , line 0, position 0. 通过断点发现&#xff0c;头有一串ZWNBSP&#xff0c;这个是BOM格式的JSON。在文件下看不到。 解决方法&#xff1a;改编码格式&#xff0c;Remove BOM....

k8s 部署 Mysqld_exporter 以及添加告警规则

最近监控 mysql 数据库&#xff0c;用了 pmm-server、pmm-client 发现监控是真的不太好用&#xff0c;还是用回 prometheus 吧。 部署mysqld_exporter k8s 部署最新版本的 mysqld_exporter&#xff0c;支持的数据库版本 MySQL >5.6、MariaDB > 10.3。 先在数据库创建用…...

基于STM32开发的智能农业环境监测系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 初始化代码控制代码应用场景 农田环境监测温室环境控制常见问题及解决方案 常见问题解决方案结论 1. 引言 智能农业环境监测系统通过集成多种环境传感器&#xff0c;实时监测土壤湿度、温度…...

【SQL】平均售价

目录 题目 分析 代码 题目 表&#xff1a;Prices ------------------------ | Column Name | Type | ------------------------ | product_id | int | | start_date | date | | end_date | date | | price | int | ---------------…...

存储器与CPU的连接

1.单块存储芯片与CPU的连接 单独的一块独立的存储芯片提供的线有&#xff1a;地址总线&#xff0c;数据总线&#xff0c;读写控制线&#xff0c;片选线&#xff0c;如果该存储器只有八根数据总线用于输出数据&#xff0c;而cpu一次可以读64位的数据呢&#xff1f; 我们可以将八…...

unity--webgl 访问本地index.html

目录 1:使用本地服务器 1.1 使用 Python 的 SimpleHTTPServer 1.2 使用 Node.js 的 http-server 2&#xff1a;让其他人通过 IP 地址来访问你的 Unity WebGL 项目 2.1: 确保服务器可访问 2.2 获取公共 IP 地址 2.3 配置本地服务器 1.使用 Python 的 SimpleHTTPServer 2…...

慢慢欣赏DPDK RTE_MAX_ETHPORTS的定义

DPDK代码里面&#xff0c;RTE_MAX_ETHPORTS是一个常见的宏定义&#xff0c;但是在.c和.h文件找不到其定义&#xff0c;在全文件搜索条件下&#xff0c;在config/meson.build找到这么一个定义 dpdk_conf.set(RTE_MAX_ETHPORTS, get_option(max_ethports)) 该宏定义是根据构建输…...

Java Nacos与Gateway的使用

Java系列文章目录 IDEA使用指南 Java泛型总结&#xff08;快速上手详解&#xff09; Java Lambda表达式总结&#xff08;快速上手详解&#xff09; Java Optional容器总结&#xff08;快速上手图解&#xff09; Java 自定义注解笔记总结&#xff08;油管&#xff09; Jav…...

前端项目中的Server-sent Events(SSE)项目实践及其与websocket的区别

前端项目中的Server-sent Events(SSE)项目实践 前言 在前端开发中&#xff0c;实时数据更新是提升用户体验的重要因素之一。Server-SentEvents(SSE)是一种高效的技术&#xff0c;允许服务器通过单向连接将实时数据推送到客户端。下面将从SSE的基本改变&#xff0c;使用场景展…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 ​编辑​编辑 UDP的特征 socke函数 bind函数 recvfrom函数&#xff08;接收函数&#xff09; sendto函数&#xff08;发送函数&#xff09; 五、网络编程之 UDP 用…...

面试高频问题

文章目录 &#x1f680; 消息队列核心技术揭秘&#xff1a;从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"&#xff1f;性能背后的秘密1.1 顺序写入与零拷贝&#xff1a;性能的双引擎1.2 分区并行&#xff1a;数据的"八车道高速公路"1.3 页缓存与批量处理…...

Android写一个捕获全局异常的工具类

项目开发和实际运行过程中难免会遇到异常发生&#xff0c;系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler&#xff0c;它是Thread的子类&#xff08;就是package java.lang;里线程的Thread&#xff09;。本文将利用它将设备信息、报错信息以及错误的发生时间都…...