SQLite 嵌入式数据库

目录:

  • 一、SQLite 简介
  • 二、SQLite 数据库安装
      • 1、安装方式一:
      • 2、安装方式二:
  • 三、SQLite 的命令用法
      • 1、创建、打开、退出数据库:
      • 2、编辑数据库:
  • 四、SQLite 的编程操作
      • 1、打开 / 创建数据库的 C 接口:
      • 2、操作表的 C 接口:

一、SQLite 简介

  • 轻量化,易用的嵌入式数据库,用于设备端的数据管理,可以理解成单点的数据库。传统服务器型数据库用于管理多端设备,更加复杂
  • SQLite是一个无服务器的数据库,是自包含的。这也称为嵌入式数据库,这意味着数据库引擎作为应用程序的一部分运行
  • MySQL需要运行服务器,MySQL将需要客户端和服务器架构通过网络进行交互
SQLite的优点SQLite的缺点MySQL的优点MySQL的缺点
基于文件,易于设置和使用
适合基础开发和测试
轻松携带
使用标准SQL语法进行微小更改
使用方便
缺乏用户管理和安全功能
不容易扩展
不适合大数据库
无法定制
使用方便
提供了许多与数据库相关的功能
良好的安全功能
易于扩展,适用于大型数据库
提供良好的速度和性能
提供良好的用户管理和多种访问控制
需要一些技术专业知识来设置
与传统SQL相比,语法略有不同
  • 基于嵌入式的数据库主要有:SQLiteFirebirdBerkeley DBeXtremeDB
  • Firebird是关系型数据库,功能强大,支持存储过程,SQL兼容等
  • SQLite关系型数据库,体积小,支持ACID事务
  • Berkeley DB并没有数据库服务器的概念,他的程序直接链接到应用程序中
  • eXtremeDB是内存数据库,运行效率高

二、SQLite 数据库安装

1、安装方式一:

sudo apt-get -y install sqlite

安装的可能不是最新版本

2、安装方式二:

通过 SQLite 官方网址(https://www.sqlite.org/download.html)下载安装包

下载Source Codesqlite-autoconf.tar.gz

在这里插入图片描述

将压缩包上传到开发板上,解压并安装:

tar xvf sqlite-autoconf-3460000.tar.gzcd sqlite-autoconf-3460000// 配置安装路径在/usr/local
./configure --prefix=/usr/local// 编译
make// 安装
sudo make install

三、SQLite 的命令用法

1、创建、打开、退出数据库:

// 进入数据库指令交互页面
sqlite3// 退出数据库
.quit// 打开数据库 test.db(没有该数据库则创建该数据库)
.open test.db// 创建并打开数据库 test.db(该指令直接在终端命令窗口运行)
qulite3 test.db// 查看当前打开的数据库
.database// 敲错指令进入 ...> 状态,通过 ctrl + z 退出
...>

2、编辑数据库:

// 创建一张表格,字段分别为:整型 id,字符型 name,整型 score
create table stu(id Integer,name char,score Integer);// 列出数据库的所有表格
.tables// 在 stu 表格插入一条数据,在 values() 编辑要插入内容
insert into stu values(001,'lcx',99);// 在 stu 表格插入一条数据,只有 name 和 score 字段内容
insert into stu(name,score) values('licx',100);// 查询 stu 表格的所有字段数据
select * from stu;// 只查询 stu 表格中 name 和 score 字段的内容
select name,score from stu;// 删除 stu 表格中 id = 1 的所有数据
delete from stu where id = 1;// 删除 stu 表格
drop table stu;// 更改表格 stu 的数据,将 id = 1 的所有数据的 name 改为 'li'
update stu set name = 'li' where id = 1;// 增加 stu 表格一列数据分类:字符型 sex
alter table stu add column sex char;

四、SQLite 的编程操作

  • 编译:
    由于我的SQLite3安装在/usr/local/目录下,而相应的库在/usr/local/lib/目录下:
    在这里插入图片描述
    编译时应该链接库:-lsqlite3

1、打开 / 创建数据库的 C 接口:

打开一个指向 SQLite 数据库文件的连接:

#include <sqlite3.h>int sqlite3_open(const char *filename, sqlite3 **ppDb);
返回值:成功返回 0,失败返回非 0 错误代码
filename参数:需要打开的SQLite数据库的文件名
ppDb参数:返回一个用于其他SQLite程序的数据库连接对象

关闭之前调用 sqlite3_open() 打开的数据库连接:

#include <sqlite3.h>int sqlite3_close(sqlite3 *ppDb);
返回值:成功返回 0,失败返回错误代码
如果还有查询没有完成,sqlite3_close()将返回SQLITE_BUSY禁止关闭的错误消息

错误信息:

#include <sqlite3.h>const char *sqlite3_errmsg(sqlite3 *db);
// 通过出错的句柄返回错误信息,获取最近调用的 API 接口返回的错误信息int sqlite3_errcode(sqlite3 *db);
// 通过出错句柄返回错误码,通常用来获取最近调用的 API 接口返回的错误代码

打开关闭数据库例程:

#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>int main(int argc, char* argv[])
{sqlite3 *db;char *zErrMsg = 0;int rc;if(argc < 2){printf("Usage: %s xxx.db\n", argv[0]);return -1;}rc = sqlite3_open(argv[1], &db);if(rc){printf("Can't open database: %s\n", sqlite3_errmsg(db));printf("Error code: %d\n", sqlite3_errcode(db));return -1;}else{printf("Opened database successfully\n");}sqlite3_close(db);return 0;
}

2、操作表的 C 接口:

操作数据库的函数:

#include <sqlite3.h>sqlite3_exec(sqlite3 *db, const char *sql, sqlite_callback, void *data, char **errmsg);// 回调函数
typedef int (*sqlite3_callback)(void*,int,char**, char**);
返回值:成功返回 0,失败返回错误代码
db参数:数据库的句柄
sql参数:执行SQL命令的语句,参考 三、SQLite 的命令用法
sqlite_callback类型函数参数:回调函数:
int callback(void *arg, int column_size, char *column_value[], char *column_name[]);

arg参数:         执行sqlite3_exec()时由sqlite3_exec()传递给回调函数sqlite3_exec()data参数值

column_size参数:    执行sqlite3_exec()时由sqlite3_exec()传递给回调函数数据库的字段数

column_value参数:  执行sqlite3_exec()时由sqlite3_exec()传递给回调函数数据库列的值

column_name参数:    执行sqlite3_exec()时由sqlite3_exec()传递给回调函数字段名
data参数:传递给回调函数的参数地址
errmsg参数:返回的错误信息

例程:打印数据库中 stu 表的数据:

#include <stdio.h>
#include <sqlite3.h>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;		// 这里必须返回 0,这样数据库中有多少条数据,这个回调函数就会被调用多少次
}int main(char argc, char **argv)
{sqlite3 *db;int ret;char *errMsg = NULL;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_exec(db, "select * from stu;", callback, "content of sql:", &errMsg);// 注意我们的 errMsg 初始化时为 NULL 空指针,理由是 sqlite_exec() 运行时会为该指针分配内存空间sqlite3_close(db);printf("done\n");return 0;
}

现有如图所示表:
在这里插入图片描述

运行结果:
在这里插入图片描述

创建表操作(关键代码):

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;
}......	......	......	......	......	......ret = sqlite3_exec(db, "create table stu(id Integer,name char);", \callback, NULL, &errMsg);if( ret != SQLITE_OK ){fprintf(stderr, "SQL error: %s\n", errMsg);sqlite3_free(errMsg);}else{fprintf(stdout, "Table created successfully\n");}

向表中插入数据(关键代码)

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;
}......	......	......	......	......	......rc = sqlite3_exec(db, "insert into stu values(003, 'li');", callback, NULL, &errMsg);if( rc != SQLITE_OK ){fprintf(stderr, "SQL error: %s\n", errMsg);sqlite3_free(errMsg);}else{fprintf(stdout, "Records created successfully\n");
}

关于表数据的增删改查代码大同小异,这里不作过多赘述…

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

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

相关文章

Qt/C++音视频开发78-获取本地摄像头支持的分辨率/帧率/格式等信息/mjpeg/yuyv/h264

一、前言 上一篇文章讲到用ffmpeg命令方式执行打印到日志输出&#xff0c;可以拿到本地摄像头设备信息&#xff0c;顺藤摸瓜&#xff0c;发现可以通过执行 ffmpeg -f dshow -list_options true -i video“Webcam” 命令获取指定摄像头设备的分辨率帧率格式等信息&#xff0c;会…

基于springboot+vue+uniapp的高校宿舍信息管理系统小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

【数据结构/操作系统 堆和栈】区别及应用场景、底层原理图解

堆和栈 比较有趣的是&#xff0c;计算机网络、操作系统中都会对堆栈有不同方面比较详细的描述&#xff0c;而使用的地方通常对这些底层的细节表现得没有那么明显。 但如果你能了解堆栈在计算机网络和操作系统中的表现形式&#xff0c;在你写代码时就会有不一样的认识&#xff…

Nordic 52832作为HID 键盘连接配对电视/投影后控制没反应问题的分析和解决

问题现象&#xff1a;我们的一款HID键盘硬件一直都工作的很好&#xff0c;连接配对后使用起来和原装键盘效果差不多&#xff0c;但是后面陆续有用户反馈家里的电视等蓝牙设备配对连接我们的键盘后&#xff0c;虽然显示已连接&#xff0c;但实际上控制不了。设备涉及到了好些品牌…

Sentinel-1 Level 1数据处理的详细算法定义(一)

《Sentinel-1 Level 1数据处理的详细算法定义》文档定义和描述了Sentinel-1实现的Level 1处理算法和方程&#xff0c;以便生成Level 1产品。这些算法适用于Sentinel-1的Stripmap、Interferometric Wide-swath (IW)、Extra-wide-swath (EW)和Wave模式。 今天介绍的内容如下&…

linux软链接和硬链接的区别

1 创建软链接和硬链接 如下图所示&#xff0c;一开始有两个文件soft和hard。使用 ln -s soft soft1创建软链接&#xff0c;soft1是soft的软链接&#xff1b;使用ln hard hard1创建硬链接&#xff0c;hard1是hard的硬链接。可以看到软链接的文件类型和其它3个文件的文件类型是不…

【JVM系列】Full GC(完全垃圾回收)的原因及分析

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

使用Python实现CartPole游戏

在深度强化学习内容的介绍中&#xff0c;提出了CartPole游戏进行深度强化学习&#xff0c;现在提供一种用Python简单实现Cart Pole游戏的方法。 1. 游戏介绍 CartPole 游戏是一个经典的强化学习问题&#xff0c;其中有一个小车&#xff08;cart&#xff09;和一个杆&#xff…

用网络编程完成windows和linux跨平台之间的通信(服务器)

服务器代码逻辑&#xff1a; 服务器功能 创建 Socket&#xff1a; 服务器首先创建一个 Socket 对象&#xff0c;用于进行网络通信。通常使用 socket() 函数创建。 绑定&#xff08;Bind&#xff09;&#xff1a; 服务器将 Socket 绑定到一个特定的 IP 地址和端口号上。这是通过…

昇思25天学习打卡营第19天 | RNN实现情感分类

RNN实现情感分类 概述 情感分类是自然语言处理中的经典任务&#xff0c;是典型的分类问题。本节使用MindSpore实现一个基于RNN网络的情感分类模型&#xff0c;实现如下的效果&#xff1a; 输入: This film is terrible 正确标签: Negative 预测标签: Negative输入: This fil…

Go 中的类型推断

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【三级等保】等保整体建设方案(Word原件)

建设要点目录&#xff1a; 1、系统定级与安全域 2、实施方案设计 3、安全防护体系建设规划 软件全文档&#xff0c;全方案获取方式&#xff1a;本文末个人名片直接获取。

【Python】基于KMeans的航空公司客户数据聚类分析

&#x1f490;大家好&#xff01;我是码银~&#xff0c;欢迎关注&#x1f490;&#xff1a; CSDN&#xff1a;码银 公众号&#xff1a;码银学编程 实验目的和要求 会用Python创建Kmeans聚类分析模型使用KMeans模型对航空公司客户价值进行聚类分析会对聚类结果进行分析评价 实…

Python酷库之旅-第三方库Pandas(008)

目录 一、用法精讲 16、pandas.DataFrame.to_json函数 16-1、语法 16-2、参数 16-3、功能 16-4、返回值 16-5、说明 16-6、用法 16-6-1、数据准备 16-6-2、代码示例 16-6-3、结果输出 17、pandas.read_html函数 17-1、语法 17-2、参数 17-3、功能 17-4、返回值…

介绍东芝TB62262FTAG芯片:高性能两相双极步进电机驱动器

在当今快速发展的科技领域&#xff0c;高性能的电机驱动器对于许多工程项目来说至关重要。东芝的TB62262FTAG这款两相双极步进电机驱动器采用PWM斩波技术&#xff0c;集成了多个先进功能&#xff0c;适用于各种工业和消费类应用。本文将详细介绍TB62262FTAG的参数、性能、优势及…

《向量数据库指南》——Milvus Cloud检索器增强的深度探讨:句子窗口检索与元数据过滤

检索器增强的深度探讨&#xff1a;句子窗口检索与元数据过滤 在信息爆炸的时代&#xff0c;高效的检索系统成为了连接用户与海量数据的关键桥梁。为了进一步提升检索的准确性和用户满意度&#xff0c;检索器增强技术应运而生&#xff0c;其中句子窗口检索与元数据过滤作为两大…

【Qt】day3 自定义控件、框架、定时器、QPainter、QFile

文章目录 自定义控件封装自定义框架定时器第一种方式第二种方式 &#xff08;推荐&#xff09; 事件分发器QPainter基本操作高级设置抗锯齿移动坐标原点 画家画资源图片&#xff0c;并实现手动移动 作业QPaintDevice绘图设备QPixmapQimageQPicture QFile文件读写操作QFileInfo文…

移动校园(3):处理全校课程数据excel文档,实现空闲教室查询与课程表查询

首先打开教学平台 然后导出为excel文档 import mathimport pandas as pd import pymssql serverName 127.0.0.1 userName sa passWord 123456 databaseuniSchool conn pymssql.connect(serverserverName,useruserName,passwordpassWord,databasedatabase) cursor conn.cur…

昇思11天

基于 MindSpore 实现 BERT 对话情绪识别 BERT模型概述 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是由Google于2018年开发并发布的一种新型语言模型。BERT在许多自然语言处理&#xff08;NLP&#xff09;任务中发挥着重要作用&am…

【C++】map和set详解

目录 1. 关联式容器 2. 键值对pair 3. 树形结构的关联式容器 4. set 4.1 set的介绍 4.2 set的构造 4.3 set的迭代器 4.4 set的容量 4.5 set的常用函数 5. multiset 6. map 6.1 map的介绍 6.2 map的构造 6.3 map的迭代器 6.4 map的容量 6.5 map的operator[] 6.6…