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.gz

cd 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");
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

欧拉函数.

性质1&#xff1a;质数n的欧拉函数为n-1. 性质2&#xff1a;如果p&#xff0c;q都是质数&#xff0c;那么ϕ ( p ∗ q ) ϕ ( p ) ∗ ϕ ( q ) ( p − 1 ) ∗ ( q − 1 ) 证明&#xff1a;p&#xff0c;2p....q*p都不与q*p互质&#xff0c;q同理&#xff0c;所以总的不互质个…

WPS+Python爬取百度之星排名

运行效果 手动拉取 https://www.matiji.net/exam/contest/contestdetail/146 如果手动查找&#xff0c;那么只能通过翻页的方式&#xff0c;每页10行&#xff08;外加一行自己&#xff09;。 爬取效果预览 本脚本爬取了个人排名和高校排名&#xff0c;可以借助WPS或MS Offi…

专业140+总分420+天津大学815信号与系统考研经验天大电子信息与通信工程,真题,大纲,参考书。

顺利上岸天津大学&#xff0c;专业课815信号与系统140&#xff0c;总分420&#xff0c;总结一些自己的复习经历&#xff0c;希望对于报考天大的同学有些许帮助&#xff0c;少走弯路&#xff0c;顺利上岸。专业课&#xff1a; 815信号与系统&#xff1a;指定教材吴大正&#xf…

缺失行处理(R和python)

R(complete.cases) rm(listls()) # 创建一个包含缺失值的数据框 # df <- data.frame( # x c(1, 2, NA, 4), # y c(NA, 2, 3, 4), # z c(1, NA, 3, 3) # ) # # # 使用complete.cases函数筛选包含缺失值的数据行 # missing_rows <- !complete.cases(df) # # # …

Vue2前端实现数据可视化大屏全局自适应 Vue实现所有页面自适应 Vue实现自适应所有屏幕

Vue自适应所有屏幕大小,目前页面自适应,尤其是数据可视化大屏的自适应更是案例很多 今天就记录一下使用Vue全局自适应各种屏幕大小的功能 在Vue.js中创建一个数据大屏,并使其能够自适应不同屏幕大小,通常涉及到布局的响应式设计、CSS媒体查询、以及利用Vue的事件系统来处理…

C++面向对象的常见面试题目(一)

1. 面向对象的三大特征 &#xff08;1&#xff09;封装&#xff1a;隐藏对象的内部状态&#xff0c;只暴露必要的接口。 #include <iostream> #include <string>// 定义一个简单的类 Person class Person { private: // 私有成员&#xff0c;外部不可直接访问std…

通俗易懂的信道复用技术详解:频分、时分、波分与码分复用

在现代通信网络中&#xff0c;信道复用技术 扮演着至关重要的角色。今天&#xff0c;我们将用通俗易懂的语言来讲解几种常见的信道复用技术&#xff1a;频分复用、时分复用、波分复用 和 码分复用。这篇文章特别适合基础小白&#xff0c;希望能帮助你快速理解这些概念。 一、频…

Bean的管理

1.主动获取Bean spring项目在需要时&#xff0c;会自动从IOC容器中获取需要的Bean 我们也可以自己主动的得到Bean对象 &#xff08;1&#xff09;获取bean对象&#xff0c;首先获取SpringIOC对象 private ApplicationContext applicationContext //IOC容器对象 (2 )方法…

[算法] 优先算法(四):滑动窗口(下)

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

Springboot 敏感词过滤

参考&#xff1a;网站是怎么屏蔽脏话的呢&#xff1a;简单学会SpringBoot项目敏感词、违规词过滤方案_springboot 项目关键词过滤-CSDN博客 【敏感词过滤】_wx60d2a462203aa的技术博客_51CTO博客 1、添加依赖 <dependency><groupId>com.github.houbb</groupI…

模型训练之数据集

我们知道人工智能的四大要素&#xff1a;数据、算法、算力、场景。我们训练模型离不开数据 目标 一、数据集划分 定义 数据集&#xff1a;训练集是一组训练数据。 样本&#xff1a;一组数据中一个数据 特征&#xff1a;反映样本在某方面的表现、属性或性质事项 训练集&#…

输入Rviz打不开,显示could not contact Ros master at[..],retrying

直接输入rviz会报错无法打开 解决方法&#xff1a; 先输入roscore&#xff0c;再用ctrlaltt打开新终端&#xff0c;在新终端输入rviz/rosrun rviz rviz即可

深度学习3 基于规则的决策树模型

1.决策树是一种归纳学习算法&#xff0c;从一些没有规则、没有顺序、杂乱无章的数据中&#xff0c;推理出决 策模型。不管是什么算法的决策树&#xff0c;都是一种对实例进行分类的树形结构。决策树有三个要素&#xff1a;节点(Node)、分支(Branches)和结果(Leaf)。 训练决策树…

二、Spring

二、Spring 1、Spring简介 1.1、Spring概述 官网地址&#xff1a;https://spring.io/ Spring 是最受欢迎的企业级 Java 应用程序开发框架&#xff0c;数以百万的来自世界各地的开发人员使用 Spring 框架来创建性能好、易于测试、可重用的代码。 Spring 框架是一个开源的 Jav…

VMware Workstation Pro 17.5.2 + license key

Workstation Pro是专为Windows操作系统设计的功能强大的虚拟化软件平台,它允许用户在其计算机上创建和运行虚拟机,这使他们能够同时与多个操作系统、应用程序和开发环境一起工作。 Workstation Pro的主要特点之一是其易用性,程序提供了直观的界面,允许用户轻松创建、配置和…

JCR一区 | Matlab实现GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断

JJCR一区 | Matlab实现GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断 目录 JJCR一区 | Matlab实现GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断分类效果格拉姆矩阵图GAF-PCNN-MATTGASF-CNNGADF-CNN 基本介绍程序设计参考资料 分…

Ubuntu24.04清理常见跟踪软件tracker

尽量一天一更&#xff0c;不刷视频&#xff0c;好好生活 打开系统监视器&#xff0c;发现开机有个tracker-miner-fs-fs3的跟踪程序&#xff0c;而且上传了10kb的数据。 搜索知&#xff0c;该程序会搜集应用和文件的信息。 删除tracker 显示带tracker的apt程序 sudo apt lis…

【Excel】 给证件照换底色

1. 双击图片 → 删除背景 2. 标记要保留的区域 → 标记 → 保留更改 3. 重新设置背景色

最新整理的机器人相关数据合集(1993-2022年不等 具体看数据类型)

机器人安装数据是指记录全球或特定区域内工业机器人新安装数量的信息&#xff0c;这一数据由国际机器人联合会(IFR)等权威机构定期发布。这些数据不仅揭示了机器人技术的市场需求趋势&#xff0c;还反映了各国和地区自动化水平及产业升级的步伐。例如&#xff0c;数据显示中国在…

基于Java+SpringMvc+Vue技术的图书管理系统的设计与实现(60页论文参考)

博主介绍&#xff1a;硕士研究生&#xff0c;专注于Java技术领域开发与管理&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架构思想、较扎实的技术功底和资深的项目管理经…