SQLite

1、SQLite简介

        轻量化、易用的嵌入式数据库,用于设备端的数据管理,可以理解成单点的数据库。传统服务器型数据库用于管理多端设备,更加复杂。

        SQLite是一个无服务器的数据库,是自包含的。这也称为嵌入式数据库,这意味着数据库引擎作为应用程序的一部分运行。

        MySQL需要运行服务器,MySQL将需要客户端和服务器架构通过网络进行交互。

优点缺点
SQLite
基于文件,易于设置和使用
适合基础开发和测试
轻松携带
使用标准 SQL 语法进行微小更改
使用方便
缺乏用户管理和安全功能
不容易扩展
不适合大数据库
无法定制
MySQL
使用方便
提供了许多与数据库相关的功能
良好的安全功能
易于扩展,适用于大型数据库
提供良好的速度和性能
提供良好的用户管理和多种访问控制
需要一些技术专业知识来设置
与传统 SQL 相比,语法略有不同

        基于嵌入式的数据库主要有:SQLiteFirebirdBerkeley DBeXtremeDB

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

                SQLite 是关系型数据库,体积小,支持ACID事务;

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

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

2、SQLite安装

        方式一:

sudo apt-get install sqlite

        方式二:去官网下载(https://www.sqlite.org/download.html),然后传到开发板上

tar xvf sqlite-autoconf-3460000.tar.gzcd sqlite-autoconf-3460000
#在该文件夹中会有一些帮助文档,readme.txt会教你怎么用
#./configure --help 可以查看一些参数#指定安装目录
./configure PREFIX=/usr/local#编译,大概要花10分钟
make#安装
sudo make install#编译完成后回到home目录下,输入sqlite3会出现以下界面
splite3

#退出
.quit

 3、SQLite的命令用法

        创建一个数据库

//方式一, 使用.open方式创建 test 数据库
sqlite3    //进入数据库
.open test.db
.quit        //退出//方式二
sqlite3 test.db //在命令运行当前窗口创建数据库test.db
//在数据库命令下
.databases    //列出当前打开的数据库
.quit        //退出

        创建一张表格

//在SQLite中int型要用Integer表示
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的编程操作

4.1 打开/创建数据库的C接口

        相关API

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接口返回的错误代码.
#include <stdio.h>
#include <sqlite3.h>int main(int argc, char* argv[])
{sqlite3 *db;int ret;if(argc < 2){printf("Usage: %s xxx.db\n", argv[0]);return -1;}//sqlite3_open 打开一个数据库,如果没有则会创建一个if((ret == sqlite3_open(argv[1], &db)) == SQLITE_OK){printf("open %s success\n", argv[1]);}else{//sqlite3_errmsg 查询错误信息printf("error: %s\n", sqlite3_errmsg(db));return -1;}//sqlite3_close 关闭之前调用 sqlite3_open() 打开的数据库连接。所有与连接相关的语句都应在连接关闭之前完成。//如果还有查询没有完成,sqlite3_close() 将返回 SQLITE_BUSY 禁止关闭的错误消息。sqlite3_close(db);printf("done\n");return 0;
}

4.2 创建表的C接口

        相关API

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 <sqlite3.h>//void *arg				sqlite3_exec函数的第四个参数
//int column_size		数据库的字段数
//char *column_value[]	列的值
//char *column_name[]	字段名字
int callback(void *arg, int column_size, char *column_value[], char *column_name[])
{int i;printf("arg = %s\n", (char *)arg);for(i=0; i<column_size; i++){printf("%s = %s\n", column_name[i], column_value[i]);}printf("===================\n");//必须使用return 0 这样数据库有多少条数据就会回调几次,不然只会回调1次return 0;
}int main(int argc, char* argv[])
{sqlite3 *db;char *errorMsg = NULL;int ret;if(argc < 2){printf("Usage: %s xxx.db\n", argv[0]);return -1;}//sqlite3_open 打开一个数据库,如果没有则会创建一个if((ret == sqlite3_open(argv[1], &db)) == SQLITE_OK){printf("open %s success\n", argv[1]);}else{//sqlite3_errmsg 查询错误信息printf("error: %s\n", sqlite3_errmsg(db));return -1;}sqlite3_exec(db, "select * from stu;", callback, "context of sql", &errorMsg);//errorMsg may sigment error!//sqlite3_close 关闭之前调用 sqlite3_open() 打开的数据库连接。所有与连接相关的语句都应在连接关闭之前完成。//如果还有查询没有完成,sqlite3_close() 将返回 SQLITE_BUSY 禁止关闭的错误消息。sqlite3_close(db);printf("done\n");return 0;
}

4.3 插入数据的C接口

#include <stdio.h>
#include <sqlite3.h>//void *arg				sqlite3_exec函数的第四个参数
//int column_size		数据库的字段数
//char *column_value[]	列的值
//char *column_name[]	字段名字
int callback(void *arg, int column_size, char *column_value[], char *column_name[])
{int i;printf("arg = %s\n", (char *)arg);for(i=0; i<column_size; i++){printf("%s = %s\n", column_name[i], column_value[i]);}printf("===================\n");//必须使用return 0 这样数据库有多少条数据就会回调几次,不然只会回调1次return 0;
}int main(int argc, char* argv[])
{sqlite3 *db;char *errorMsg = NULL;int ret;if(argc < 2){printf("Usage: %s xxx.db\n", argv[0]);return -1;}//sqlite3_open 打开一个数据库,如果没有则会创建一个if((ret == sqlite3_open(argv[1], &db)) == SQLITE_OK){printf("open %s success\n", argv[1]);}else{//sqlite3_errmsg 查询错误信息printf("error: %s\n", sqlite3_errmsg(db));return -1;}ret = sqlite3_exec(db, "create table Class01(id Integer, name char, score Integer);", \callback, "context of sql", &errorMsg);if(ret != SQLITE_OK){printf("create tables error: %s\n", errorMsg);}//yy 在当前行复制 p 在光标位置粘贴sqlite3_exec(db, "insert into Class01 values(122, 'huang', 99);", \callback, "context of sql", &errorMsg);//errorMsg may sigment error!//sqlite3_close 关闭之前调用 sqlite3_open() 打开的数据库连接。所有与连接相关的语句都应在连接关闭之前完成。//如果还有查询没有完成,sqlite3_close() 将返回 SQLITE_BUSY 禁止关闭的错误消息。sqlite3_close(db);printf("done\n");return 0;
}

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

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

相关文章

数据分析三剑客-Matplotlib

数据分析三剑客 数据分析三剑客通常指的是在Python数据分析领域中&#xff0c;三个非常重要的工具和库&#xff1a;Pandas、NumPy和Matplotlib。Pandas主要负责数据处理和分析&#xff0c;NumPy专注于数值计算和数学运算&#xff0c;而Matplotlib则负责数据可视化。这三个库相…

【安全攻防】网络安全中的序列化与反序列

1.序列化与反序列化 首先要了解序列化与反序列化的定义&#xff0c;以及序列化反序列化所用到的基本函数。 序列化&#xff1a;把对象转换为字节序列的过程称为对象的序列化&#xff0c;相当于游戏中的存档。 PHP中的序列化函数serialize() **serialize()**函数用于序列化对…

Appium自动化测试框架3

滑动与拖拽 swipe 滑动时间的长短会影响最后的结果的 是有一定误差的 from appium import webdriver import time # 启动一个字典 包装相应的启动参数 desired_caps dict() # 平台的名字&#xff0c;安卓还是IOS 大小写无所谓 desired_caps[platformName] Android # 平台的…

【串口通信】之TTL电平

1. 什么是串口 串口,全称为串行通信端口,是一种计算机硬件接口,用于实现数据的串行传输。与并行通信不同,串口通信一次只传输一个比特,数据通过串行线按顺序传输。串口通信在嵌入式系统、工业控制、计算机与外围设备通信等领域非常常见 2. 什么是串口通信 串口通信是指通过…

Docker 部署 Minio 对象存储服务器

文章目录 Github官网文档简介dockerdocker-compose.ymlmc 客户端mc 基础命令Golang 示例创建 test 账号密钥文件上传示例 Github https://github.com/minio/minio 官网 https://min.io/https://www.minio.org.cn/ 文档 https://www.minio.org.cn/docs/minio/kubernetes/up…

刚办理的手机号被停用,你可能遇到这些问题了!

很多朋友都会遇到手机号被停用的情况&#xff0c;那么你知道你的手机号为什么会被停用吗&#xff1f;接下来&#xff0c;关于手机号被停用的问题&#xff0c;跟着小编一块来了解一下吧。 ​停机的两种形态&#xff1a; 1、第一个是局方停机&#xff0c;即语音、短信和流量都不…

C++|哈希应用->布隆过滤器

目录 一、概念 二、模拟实现 三、布隆过滤器扩展应用 上一篇章学习了位图的使用&#xff0c;但它只适用于整数&#xff0c;对于要查询字符串是否在不在&#xff0c;位图并不能解决。所以针对这一问题&#xff0c;布隆过滤器可以派上用场&#xff0c;至于布隆过滤器是什么&am…

Java支付宝沙箱支付环境配置及简单测试

Java支付宝沙箱环境配置(测试) 1. 沙箱配置环境 沙箱应用 - 开放平台 (alipay.com) 2. 需要用到的基本信息 3. Pom文件添加依赖 <!--支付宝依赖 --><dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-easysdk</artifactId…

周鸿祎:大模型不是风口和泡沫,将引领新工业革命

7月2日&#xff0c;2023全球数字经济大会人工智能高峰论坛举行。360集团创始人周鸿祎在论坛发表《构建“安全可信可控易用”的企业级AI大模型》主题演讲。他表示&#xff0c;大模型不是风口和泡沫&#xff0c;将引领新工业革命。在城市、行业、企业数字化转型到智能化的过程中&…

#### golang中【堆】的使用及底层 ####

声明&#xff0c;本文部分内容摘自&#xff1a; Go: 深入理解堆实现及应用-腾讯云开发者社区-腾讯云 数组实现堆 | WXue 堆&#xff08;Heap&#xff09;是实现优先队列的数据结构&#xff0c;Go提供了接口和方法来操作堆。 应用 package mainimport ("container/heap&q…

C++:类型转换

目录 一、C语言中的类型转换 二、为什么C要新的转换格式 三、 C强制类型转换 1.static_cast 2.reinterpret_cast 3.const_cast 4.dynamic_cast 一、C语言中的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&…

Land survey boundary report (template)

Land survey boundary report (template) 土地勘测定界报告&#xff08;模板&#xff09;.doc

可视化学习之pytorch可视化工具visdom

文章摘自详解PyTorch可视化工具visdom&#xff08;一&#xff09;-CSDN博客 模型训练过程中需要实时监听并可视化一些数据&#xff0c;如损失值loss&#xff0c;正确率acc等。在tensorflow中&#xff0c;使用的工具为tensorboard&#xff1b; 安装一下试试 1.安装 pip inst…

Android的课程学习助手APP-计算机毕业设计源码19307

基于Android的课程学习助手APP 摘 要 在数字化、信息化的时代背景下&#xff0c;移动学习已成为现代教育发展的重要趋势。为了满足广大学生对高效、便捷学习方式的迫切需求&#xff0c;一款基于Android平台的课程学习助手APP应运而生。这款APP巧妙地将先进的信息技术与学习体验…

通过一个单相逆变器仿真深度学习PR控制器

目录 前言 ​编辑 PR控制器的理论 PR控制器不同表达式及其建模 PR控制器连续积分组合及模型 PR控制器连续传递函数及模型 PR控制器离散积分及模型 PR控制器离散传递函数及模型 PR控制器差分方程及模型 系统仿真效果 总结 前言 在项目开发中常用PI控制器&#xff0c;这次在…

解读 Amazon Q | 用 AI 聊天机器人连接你与未来的无限可能

在美国当地时间11月28日&#xff0c;亚马逊云科技在拉斯维加斯举办了 re:Invent 大会&#xff0c;大会介绍了许多今年来新增的核心产品与功能&#xff0c;着重讲解了生成式 AI 引领人工智能未来的前进方向&#xff0c;亚马逊作为云计算领域的龙头&#xff0c;相信会继续给我们的…

基于路径长度的样条插补算法(自动驾驶和路径跟踪控制适用)

以前在做车辆跟踪控制的时候发现在针对有多个X和多个Y对应的路径插补时候&#xff0c;总是报错&#xff0c;因为MATLAB里面的interp1插补函数它要求x要唯一对应一个y&#xff0c;当路径以单独的x或者y来求插补时候的时候就报错。由于在使用Matlab的interp1函数进行插值时&#…

重生之算法刷题之路之链表初探(三)

算法刷题之路之链表初探&#xff08;三&#xff09; 今天来学习的算法题是leecode2链表相加&#xff0c;是一道简单的入门题&#xff0c;但是原子在做的时候其实是有些抓耳挠腮&#xff0c;看了官解之后才恍然大悟&#xff01; 条件 项目解释 有题目可以知道&#xff0c;我们需…

C#Modbus专题

1&#xff0c;辅助工具。 1&#xff0c;虚拟串口工具&#xff08;vspd.exe&#xff09; 2&#xff0c;Modubus模拟主站(Modbus Poll) 3&#xff0c;Modbus模拟从站(Modbus Slave) 4&#xff0c;OPC服务软件(KEPServerEx V4.0)。 下载链接&#xff1a;https://download.csdn.n…

Redisson框架

1. Redisson锁与Redis订阅与发布模式的联系&#xff1a; Redisson锁中&#xff0c;使用订阅发布模式去通知等待锁的客户端&#xff1a;锁已经释放&#xff0c;可以进行抢锁。 publish channel_name message&#xff1a;将消息发送到指定频道 解锁时&#xff0c;在Lua解锁脚本…