嵌入式数据库之SQLite
1.SQLite简介
轻量化,易用的嵌入式数据库,用于设备端的数据管理,可以理解成单点的数据库。传统服务器型数据 库用于管理多端设备,更加复杂。
SQLite是一个无服务器的数据库,是自包含的。这也称为嵌入式数据库,这意味着数据库引擎作 为应用程序的一部分运行。 MySQL需要运行服务器,MySQL将需要客户端和服务器架构通过网络进行交互。
SQLite和MySQL的优缺点对比:

基于嵌入式的数据库主要有:SQLite,Firebird,Berkeley DB,eXtremeDB
Firebird 是关系型数据库,功能强大,支持存储过程,SQL兼容等
SQLite 关系型数据库,体积小,支持ACID事务
Berkeley DB 并没有数据库服务器的概念,他的程序直接链接到应用程序中 eXtremeDB 是内存数据库,运行效率高
2 SQLite数据库安装
安装方式一:
sudo apt-get -y install sqlite
安装方式二:
https://www.sqlite.org/download.html
1. 把下载的文件sqlite-autoconf-3390000.tar.gz上传到开发板
2. tar xvf sqlite-autoconf-3390000.tar.gz 解压
3. cd sqlite-autoconf-3390000 进入文件夹
4. ./configure --prefix=/usr/local 配置安装路径在/usr/local
5. make 编译//比较久10分钟
6. sudo make install 安装
安装成功过,运行sqlite3 进入SQL命令操作流程。
3.SQLite的命令用法
- 创建一个数据库
方式一:
1. sqlite3 进入数据库
2. .open test.db
3. .quit
数据库退出后在命令当前路径创建数据库test.db
方式二:
sqlite3 test.db //在命令运行当前窗口创建数据库test.db
在数据库命令下
.databases 列出当前打开的数据库
.quit 退出
- 创建一张表格
create table stu2(id Integer,name char,score Integer);
- 插入一条记录
insert into stu values(18130106,'huang',99);
insert into stu2 values(18130101,"gang",100); ''和""都行
insert into stu(name,score) values("huanggang",98); 插入部分字段内容
- 查看数据库的记录
select * from stu; //查询所有字段的结果
select name,score from stu; //查询数据库中部分字段的内容
- 删除一条记录
delete from stu where id = 18130101;
- 更改一条记录
update stu set name = 'huangg' where id = 18130106;
- 删除一张表
drop table stu;
- 增加一列
alter table stu add column sex char;
4.SQLite的编程操作
sqlite3_open(const char *filename, sqlite3 **ppDb)
该例程打开一个指向 SQLite 数据库文件的连接,返回一个用于其他 SQLite 程序的数据库连接对象。sqlite3_close(sqlite3*)
该例程关闭之前调用 sqlite3_open() 打开的数据库连接。所有与连接相关的语句都应在连接关闭之前完
成。
如果还有查询没有完成,sqlite3_close() 将返回 SQLITE_BUSY 禁止关闭的错误消息。const char *sqlite3_errmsg(sqlite3*);sqlite3_errcode() 通常用来获取最近调用的API接口返回的错误代码.

示例代码:
1、打开数据库:
#include <stdio.h>
#include <sqlite3.h>
int main(char argc, char **argv)
{sqlite3 *db;int ret;if(argc < 2){printf("Usage: %s xxx.db\n",argv[0]);return -1;}if( (ret = sqlite3_open(argv[1],&db)) == SQLITE_OK){printf("open %s success\n",argv[1]);}else{printf("error:%s,%d\n",sqlite3_errmsg(db),ret);if(ret == 14){printf("permission den\n");}return -1;}sqlite3_close(db);printf("done\n");return 0;
}
2、创建表的接口:
sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char
**errmsg)
该例程提供了一个执行 SQL 命令的快捷方式,SQL 命令由 sql 参数提供,可以由多个 SQL 命令组成。
在这里,第一个参数 sqlite3 是打开的数据库对象,sqlite_callback 是一个回调,data 作为其第一
个参数,errmsg 将被返回用来获取程序生成的任何错误。
sqlite3_exec() 程序解析并执行由 sql 参数所给的每个命令,直到字符串结束或者遇到错误为止。int callback(void *arg, int column_size, char *column_value[], char
*column_name[])
参数分析:
void *arg:是sqlite3_exec函数的第四个参数
column_size:数据库的字段数
column_value[]:列的值
column_name:字段名字
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>static 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(int argc, char* argv[])
{sqlite3 *db;char *zErrMsg = 0;int rc;char *sql;/* Open database */rc = sqlite3_open("test.db", &db);if( rc ){fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));exit(0);}else{fprintf(stdout, "Opened database successfully\n");}/* Create SQL statement */sql = "CREATE TABLE COMPANY(" \"ID INT PRIMARY KEY NOT NULL," \"NAME TEXT NOT NULL," \"AGE INT NOT NULL," \"ADDRESS CHAR(50)," \"SALARY REAL );";/* Execute SQL statement */rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);if( rc != SQLITE_OK ){fprintf(stderr, "SQL error: %s\n", zErrMsg);sqlite3_free(zErrMsg);}else{fprintf(stdout, "Table created successfully\n");}sqlite3_close(db);return 0;
}
3、插入数据的接口
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
static 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(int argc, char* argv[])
{sqlite3 *db;char *zErrMsg = 0;int rc;char *sql;/* Open database */rc = sqlite3_open("test.db", &db);if( rc ){fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));exit(0);}else{fprintf(stderr, "Opened database successfully\n");}/* Create SQL statement */sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \"VALUES (1, 'Paul', 32, 'California', 20000.00 ); " \"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \"VALUES (2, 'Allen', 25, 'Texas', 15000.00 ); " \"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \"VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );" \"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \"VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );";/* Execute SQL statement */rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);if( rc != SQLITE_OK ){fprintf(stderr, "SQL error: %s\n", zErrMsg);sqlite3_free(zErrMsg);}else{fprintf(stdout, "Records created successfully\n");}sqlite3_close(db);return 0;
}
4、select操作
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
static int callback(void *data, int argc, char **argv, char **azColName){int i;fprintf(stderr, "%s: ", (const char*)data);for(i=0; i<argc; i++){printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");}printf("\n");return 0;
}int main(int argc, char* argv[])
{sqlite3 *db;char *zErrMsg = 0;int rc;char *sql;const char* data = "Callback function called";/* Open database */rc = sqlite3_open("test.db", &db);/* Create SQL statement */sql = "SELECT * from COMPANY";/* Execute SQL statement */rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);sqlite3_close(db);return 0;
}
5、update操作:
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
static int callback(void *data, int argc, char **argv, char **azColName){int i;fprintf(stderr, "%s: ", (const char*)data);for(i=0; i<argc; i++){printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");}printf("\n");return 0;
}
int main(int argc, char* argv[])
{sqlite3 *db;char *zErrMsg = 0;int rc;char *sql;const char* data = "Callback function called";/* Open database */rc = sqlite3_open("test.db", &db);if( rc ){fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));exit(0);}else{fprintf(stderr, "Opened database successfully\n");}/* Create merged SQL statement */sql = "UPDATE COMPANY set SALARY = 25000.00 where ID=1; " \"SELECT * from COMPANY";/* Execute SQL statement */rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);if( rc != SQLITE_OK ){fprintf(stderr, "SQL error: %s\n", zErrMsg);sqlite3_free(zErrMsg);}else{fprintf(stdout, "Operation done successfully\n");}sqlite3_close(db);return 0;
}
6、delect操作
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
static int callback(void *data, int argc, char **argv, char **azColName){int i;fprintf(stderr, "%s: ", (const char*)data);for(i=0; i<argc; i++){printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");}printf("\n");return 0;
}
int main(int argc, char* argv[])
{sqlite3 *db;char *zErrMsg = 0;int rc;char *sql;const char* data = "Callback function called";/* Open database */rc = sqlite3_open("test.db", &db);if( rc ){fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));exit(0);}else{fprintf(stderr, "Opened database successfully\n");}/* Create merged SQL statement */sql = "DELETE from COMPANY where ID=2; " \"SELECT * from COMPANY";/* Execute SQL statement */rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);if( rc != SQLITE_OK ){fprintf(stderr, "SQL error: %s\n", zErrMsg);sqlite3_free(zErrMsg);}else{fprintf(stdout, "Operation done successfully\n");}sqlite3_close(db);return 0;
}
相关文章:
嵌入式数据库之SQLite
1.SQLite简介 轻量化,易用的嵌入式数据库,用于设备端的数据管理,可以理解成单点的数据库。传统服务器型数据 库用于管理多端设备,更加复杂。 SQLite是一个无服务器的数据库,是自包含的。这也称为嵌入式数据库&#x…...
idea下tomcat运行乱码问题解决方法
idea虚拟机选项添加-Dfile.encodingUTF-8...
人工智能TensorFlow MNIST手写数字识别——实战篇
上期文章TensorFlow手写数字-训练篇,我们训练了我们的神经网络,本期使用上次训练的模型,来识别手写数字(本期构建TensorFlow神经网络代码为上期文章分享代码) http://scs.ryerson.ca/~aharley/vis/conv/ 0、插入第三方库 from PIL import Image# 处理图片 import tensorf…...
Vue 本地应用-计数器
逻辑是在点击按钮的时候执行,那么要为按钮绑定点击事件,整体语法如下: <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>首页</title><link href"" type"text/c…...
深入了解HTTP代理在网络爬虫与SEO实践中的角色
随着互联网的不断发展,搜索引擎优化(SEO)成为各大企业和网站重要的推广手段。然而,传统的SEO方法已经难以应对日益复杂和智能化的搜索引擎算法。在这样的背景下,HTTP代理爬虫作为一种重要的工具,正在逐渐被…...
使用docker搭建nacos
使用docker搭建nacos docker搭建最新版nacosMySQL下简历nacos配置数据表拉取镜像创建挂载目录启动容器访问nacos docker搭建nacos 2.0版本 docker搭建最新版nacos 最近想在自己服务器上搭建一个nacos服务,以前一直在本地的windows上使用,而且使用着naco…...
flask中的常用装饰器
flask中的常用装饰器 Flask 框架中提供了一些内置的装饰器,这些装饰器可以帮助我们更方便地开发 Web 应用。以下是一些常用的 Flask 装饰器: app.route():这可能是 Flask 中最常用的装饰器。它用于将 URL 路由绑定到一个 Python 函数&#x…...
SQL基础语法 | 增删改查、分组、排序、limit
Shell命令框和Navicat联合使用 一、数据库层面 创建数据库 postgres# CREATE DATABASE runoobdb;查看数据库 postgres# \l选择数据库 postgres# \c runoobdb删除数据库 postgres# DROP DATABASE runoobdb;二、表格层面 创建表格 CREATE TABLE table_name(字段名称 字段数据类型…...
QT: 用定时器完成闹钟的实现
闹钟项目: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimerEvent> #include <QTime> #include <QDebug> #include <QTextToSpeech> #include <QMessageBox> #include <QTimer>QT_BEGIN…...
Boyer-Moore 投票算法
这里先贴题目: Boyer-Moore 投票算法: 通俗点来讲,就是占领据点,像攻城那样,对消。 当你的据点有人时对消,无人时就占领。 这道题使用该算法可实现时间复杂度为O(n),空间复杂度为O(1),接下来看…...
C# 翻转二叉树
226 翻转二叉树 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1] 示例 2: 输入:root [2,1,3] 输出:…...
RocketMQ教程-(5)-功能特性-消费者分类
Apache RocketMQ 支持 PushConsumer 、 SimpleConsumer 以及 PullConsumer 这三种类型的消费者,本文分别从使用方式、实现原理、可靠性重试和适用场景等方面为您介绍这三种类型的消费者。 背景信息 Apache RocketMQ 面向不同的业务场景提供了不同消费者类型&…...
Kafka原理剖析
一、简介 Kafka是一个分布式的、分区的、多副本的消息发布-订阅系统,它提供了类似于JMS的特性,但在设计上完全不同,它具有消息持久化、高吞吐、分布式、多客户端支持、实时等特性,适用于离线和在线的消息消费,如常规的…...
word怎么转换成pdf?分享几种转换方法
word怎么转换成pdf?将Word文档转换成PDF文件有几个好处。首先,PDF文件通常比Word文档更容易在不同设备和操作系统上查看和共享。其次,PDF文件通常比Word文档更难以修改,这使得它们在需要保护文件内容的情况下更加安全可靠。最后&a…...
基于XDMA 中断模式的 PCIE3.0 QT上位机与FPGA数据交互架构 提供工程源码和QT上位机源码
目录 1、前言2、我已有的PCIE方案3、PCIE理论4、总体设计思路和方案图像产生、发送、缓存数据处理XDMA简介XDMA中断模式图像读取、输出、显示QT上位机及其源码 5、vivado工程详解6、上板调试验证7、福利:工程代码的获取 1、前言 PCIE(PCI Express&#…...
Vue 中通用的 css 列表入场动画效果
css 代码 .gradientAnimation {animation-name: gradient;animation-duration: 0.85s;animation-fill-mode: forwards;opacity: 0; }/* 不带前缀的放到最后 */ keyframes gradient {0% {opacity: 0;transform: translate(-100px, 0px);}100% {opacity: 1;transform: translate…...
微分流形2:流形上的矢量场和张量场
来了来了,切向量,切空间。流形上的所有的线性泛函的集合,注意是函数的集合。然后取流形上的某点p,它的切向量为,线性泛函到实数的映射。没错,是函数到实数的映射,是不是想到了求导。我们要逐渐熟…...
C++数组、向量和列表的练习
运行代码: //C数组、向量和列表的练习 #include"std_lib_facilities.h"int main() try {int ii[10] { 0,1,2,3,4,5,6,7,8,9 };for (int i 0; i < 10; i)//把数组中的每个元素值加2ii[i] 2;vector<int>vv(10);for (int i 0; i < 10; i)vv…...
视频剪辑矩阵分发系统Unable to load FFProbe报错技术处理?
问题一 报错处理 对于视频剪辑矩阵分发系统中出现的“Unable to load FFProbe”报错问题,可以采取以下技术处理措施进行解决。 1.检查系统中是否正确安装了FFProbe工具,并确保其路径正确配置。 2.检查系统环境变量是否正确设置,包括FFPr…...
Docker轻量级可视化工具Portainer
Portainer是一个轻量级的管理UI界面,用于管理Docker容器、镜像、卷和网络。它支持端口映射、容器启动、停止、删除、日志查看等功能,同时也提供了可视化的监控和统计功能,可以快速轻松的管理多个Docker主机。Portainer不需要额外安装依赖&…...
DynamicColor跨平台开发指南:iOS、macOS、watchOS的统一颜色解决方案
DynamicColor跨平台开发指南:iOS、macOS、watchOS的统一颜色解决方案 【免费下载链接】DynamicColor Yet another extension to manipulate colors easily in Swift and SwiftUI 项目地址: https://gitcode.com/gh_mirrors/dy/DynamicColor DynamicColor是一…...
IDEA插件开发:集成Nunchaku-flux-1-dev实现代码注释自动图解
IDEA插件开发:集成Nunchaku-flux-1-dev实现代码注释自动图解 1. 引言 作为一名Java开发者,你是否曾经面对过这样的困境:接手一个复杂的遗留系统,代码量庞大但注释稀少,逻辑关系错综复杂,光是理解代码执行…...
效率倍增:基于快马平台集成最新openclaw构建自动化采集工具
最近在做一个数据采集项目时,发现手动写爬虫实在太费时间了。每次都要重复处理请求头、代理设置、数据清洗这些基础工作,效率特别低。后来发现了openclaw这个工具包的新版本,正好结合InsCode(快马)平台快速搭建了一个自动化采集工具ÿ…...
Phi-4-mini-reasoning一文详解:专为多步推理设计的开源大模型实战
Phi-4-mini-reasoning一文详解:专为多步推理设计的开源大模型实战 1. 模型概述 Phi-4-mini-reasoning是一款专注于推理任务的文本生成模型,特别擅长处理需要多步分析的复杂问题。与通用聊天模型不同,它被设计用来解决数学题、逻辑题等需要逐…...
手把手教你部署DeepSeek-OCR:零基础实现多语言文字识别
手把手教你部署DeepSeek-OCR:零基础实现多语言文字识别 1. 为什么选择DeepSeek-OCR 在数字化时代,文字识别技术已经成为各行各业的基础需求。无论是扫描文档转电子版,还是从照片中提取文字信息,传统OCR工具往往在复杂场景下表现…...
揭秘Windows热键失踪案:Hotkey Detective侦探手册
揭秘Windows热键失踪案:Hotkey Detective侦探手册 【免费下载链接】hotkey-detective A small program for investigating stolen hotkeys under Windows 8 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 你是否曾在Windows系统中按下熟悉的…...
56:L构建蓝队AI:蓝队的智能防御
作者: HOS(安全风信子) 日期: 2026-03-07 主要来源平台: GitHub 摘要: 面对基拉等高级威胁的不断进化,传统的蓝队防御手段已经难以应对。L构建了一套蓝队AI系统,通过AI驱动的威胁检测、自动响应和防御优化&…...
基于SpringBoot+Vue的月度员工绩效考核管理系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】
摘要 现代企业管理中,绩效考核是提升员工工作效率、优化人力资源配置的重要手段。传统的绩效考核多依赖纸质记录或简单的电子表格,存在数据易丢失、统计效率低、反馈周期长等问题。随着信息化技术的发展,企业亟需一套高效、精准的绩效考核管理…...
高效一键构建:DoL-Lyra整合包的智能自动化构建系统解析
高效一键构建:DoL-Lyra整合包的智能自动化构建系统解析 【免费下载链接】DOL-CHS-MODS Degrees of Lewdity 整合 项目地址: https://gitcode.com/gh_mirrors/do/DOL-CHS-MODS 还在为Degrees of Lewdity游戏的美化整合包配置而烦恼吗?您是否曾因手…...
源码级重构与低代码交付:企业级 AI 视频管理平台的二次开发实战
作为一位在安防行业摸爬滚打 10 年的架构师,我经常被集成商朋友的灵魂拷问:“有没有一套代码,既能直接拿去给客户演示(低代码),又能让我根据客户需求改得‘面目全非’(深度定制)&…...
