【香橙派系列教程】(六)嵌入式SQLite数据库

news2024/12/30 3:10:58

【六】嵌入式SQLite数据库

文章目录

  • 【六】嵌入式SQLite数据库
    • 1.简介
    • 2.SQLite数据库安装
    • 3.SQLite命令用法
      • 1.创建数据库
      • 2.创建和查看表格
      • 3.插入查看数据(记录)
      • 4.删除更改数据(记录)
    • 4.SQLite编程操作
      • 1.打开/创建数据库的C接口
      • 2.创建表并插入数据的C接口
      • 3.SELECT操作
      • 4.UPDATE操作
      • 5.DELETE操作

1.简介

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

SQLite是一个无服务器的数据库,是自包含的。这也称为嵌入式数据库,这意味着数据库引擎作为应用程序的一部分运行。
MySQL需要运行服务器,MySQL将需要客户端和服务器架构通过网络进行交互。

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

基于嵌入式的数据库主要有:SQLite,Firebird,Berkeley DB,eXtremeDB

  1. Firebird 是关系型数据库,功能强大,支持存储过程,SQL兼容等
  2. SQLite 关系型数据库,体积小,支持ACID事务
  3. Berkeley DB 并没有数据库服务器的概念,他的程序直接链接到应用程序中
  4. eXtremeDB 是内存数据库,运行效率高

2.SQLite数据库安装

安装方式一:

这个安装的版本是2

sudo apt-get -y install sqlite

安装方式二:

总括:

  1. 把下载的文件sqlite-autoconf-3450300.tar.gz上传到开发板
  2. 解压:tar xvf sqlite-autoconf-3450300.tar.gz
  3. cd sqlite-autoconf-3450300 进入文件夹
  4. ./configure --prefix=/usr/local 配置安装路径在/usr/local
  5. make 编译(比较久10分钟)
  6. sudo make install 安装

详细过程

1.下载网址:

https://www.sqlite.org/download.html

下载sqlite3软件包(每一阶段的版本会不一样,一直在更新)

2.将下载好的压缩包上传到开发板

3.解压:tar xvf sqlite-autoconf-3450300.tar.gz

4.开始配置编译

cd sqlite-autoconf-3450300 		   //进入文件夹
./configure --prefix=/usr/local     //配置安装路径在/usr/local
make                                 //开始编译,时间很久,10分钟左右
sudo make install//安装

在主页面打入sqlite3进入数据库

3.SQLite命令用法

里面的很多命令背会就行,会用会改,没有什么道理可言。

这里只讲最基础的用法,详细的可以看https://www.runoob.com/sqlite/sqlite-tutorial.html

在正式开始之前建议先建一个名为sqlite的文件夹,方便后续的项目管理

mkdir sqlite //创建名为sqlite的文件夹
cd sqlite    //进入名为sqlite的文件夹

1.创建数据库

一个数据库可以创建多个表格,每个表格又可以创建多个数据

刚进入数据库就会给我们提示创建数据库的方法

热知识:

.db 文件通常是指 SQLite 数据库文件。SQLite 是一种轻量级的数据库引擎,常用于移动应用程序和小型桌面应用程序中存储数据。这些文件包含了结构化的数据,可以通过 SQLite 数据库管理工具或编程语言中的 SQLite 库进行访问和操作。

创建方式一:进入数据库后创建

sqlite3 		//进入数据库
.open test.db  //创建名为test.db 的数据库(有的话直接打开,没有直接创建)
.quit			//退出
数据库退出后在命令当前路径创建数据库test.db

创建方式二:在进入数据库时直接创建

sqlite3 test.db //在命令运行当前窗口创建数据库test.db

//在数据库命令下
.databases 列出当前打开的数据库
.quit 退出

2.创建和查看表格

思考一下我们以前的结构体,其实就很像一个列表。

不过在sqlite数据库里面,int=Inteager

struct stu{
    int id;
    char name;
    int score;
}

2.1在sqlite数据库下的操作:

2.1.1创建表格:

//创建一个名为stu1 的表格
create table stu1(id Integer,name char,score Integer);
create table stu(id Integer,name char,score Integer);

2.1.2查看有哪些表格:

.tables

3.插入查看数据(记录)

以下命令均在数据库命令行中操作

3.1插入数据:

insert into stu values(18130106,'huang',99);// 必须是单引号'',高版本的sqlite3已经不支持双引号""
insert into stu values(22222226,'ming',59);
insert into stu2(name,score) values('huanggang',98); //插入部分字段内容

3.2查看数据

select * from stu; //查询stu所有字段的结果
select name,score from stu; //查询stu数据库中部分字段的内容

4.删除更改数据(记录)

以下命令均在数据库命令行中操作

4.1删除表

drop table stu;

4.2删除一条数据

delete from stu where id = 18130101;

4.3更改一条数据

//	要改的表     改什么              匹配的信息
update stu set name = 'huangg' where id = 18130106;

4.4增加一列

alter table stu add column sex char;

4.SQLite编程操作

注意:文中所讲版本为sqlite3,版本过低的请自行更新。

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

下面的 C 代码段显示了如何连接到一个现有的数据库。

如果数据库不存在,那么它就会被创建,最后将返回一个数据库对象。

用到的函数介绍:

1.1 sqlite3_open:打开一个数据库对象;

//1.头文件
#include <sqlite3.h>
//2.函数原型
int sqlite3_open(const char *filename, sqlite3 **ppDb);
	filename:要打开的sqlite3数据库的路径名
	ppDb: 二级指针,用来保存打开的数据库的连接对象。

//3.返回值
成功返回SQLITE_OK,失败返回其他值。

返回值所对应的宏:

1.2 sqlite3_close:关闭数据库连接对象

//1.头文件
#include <sqlite3.h>
//2.函数原型
int sqlite3_close(sqlite3*);
	在使用此函数之前要先调用 sqlite3_open(); 打开的数据库连接。
	
//3.返回值
所有与连接相关的语句都应在连接关闭之前完成。
如果还有查询没有完成,将返回SQLITE_BUSY 禁止关闭的错误消息。

1.3用于查看错误代码信息:

const char *sqlite3_errmsg(sqlite3*);

1.4常用来获取最近调用的API接口返回的错误代码(是错误代码数字)

sqlite3_errcode(sqlite3*) ;

代码示例:

编译:gcc a.c -lsqlite3 链接到库

运行:./a.out test.db 链接到已有的数据库(如果没有会创建一个)

//a.c
#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>

int main(int argc,char **argv)
{

    sqlite3 *db = NULL;
    int ret = 0;

    if(argc<2){
        printf("Uage: %s xxx.db\n",argv[0]);
        exit(-1);
    }

    if((ret = sqlite3_open(argv[1],&db)) == SQLITE_OK){  //打开或创建一个数据库对象 成功返回SQLITE_OK 0
        printf("ret = %d   create %s ok\n",ret,argv[1]);//打印返回的数值
    }else{
        printf("ret = %d   creat %s fail\n",ret,argv[1]);//打印返回错误码的数值
        printf("error num = %d  error mesg:%s\n",sqlite3_errcode(db),sqlite3_errmsg(db));//获取最近调用的API接口返回的错误代码 and 错误信息输出
        if(ret==14){//错误码判断
            printf("permisson deny\n");
        }
        exit(-1);
    }

    sqlite3_close(db);

    return 0;
}

2.创建表并插入数据的C接口

用到的函数介绍:

sqlite3_exec:该例程提供了一个执行 SQL 命令的快捷方式,SQL 命令由 sql 参数提供,可以由多个 SQL 命令组成。

//1.头文件
#include <sqlite3.h>
//2.函数原型
int sqlite3_exec(
       sqlite3*,                                 
       const char *sql,                           
       int (*callback)(void*,int,char**,char**),  
       void *data,                                   
       char **errmsg                             
    );
//3.参数说明
sqlite3*            : open 打开的数据库的描述符
const char* sql,    : 执行的sql功能语句(可以很多语句)
*callback,          : sql语句对应的回调函数
void* data,         : 传递给回调函数的指针参数
char **errmsq       : 错误信息

int (*callback):回调函数

//1.函数原型
int callback(void *arg, int column_size, char *column_value[], char *column_name[])
//2.参数说明
*arg             :是sqlite3_exec函数的第四个参数data
column_size      :数据库的字段数(就是name sec num 这些类型有几个)
column_value[]   :列的值(就是对应的name sec score 对应的值)
column_name      :字段名字(就是name sec score的这些名字)
//3.返回值
必须会返回0		//这样才能数据库中有几条数据回调函数就会被调用几次。

回调函数:会先执行*sql对应的功能命令,然后将结果传递给回调函数

代码示例1:

功能描述:查看数据库表中的数据。

必须从头到尾读一遍,读懂读会

//b.c
#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);//这个值来自于sqlite3_exec第三个参数
    
    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;//可以理解为数据库编号,加入打开test.db,那么他有一个类似于文件的描述符,身份证
    char *errorMes = NULL;//用来存sqlite3_exec第五个参数的错误信息
    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 num = %d  error mesg:%s\n",sqlite3_errcode(db),sqlite3_errmsg(db));
      //printf("error num = %d  error mesg:%s\n",ret               ,sqlite3_errmsg(db)); 与上面同一个意思

        if(ret == 14){
            printf("permission den\n");//禁止访问的意思
        }
        return -1;
    }
    
    //sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)
    //errorMes may sigment error!
    sqlite3_exec(db, "select * from stu;",callback, "from SQL sqlite3_exec:",&errorMes);
    sqlite3_close(db);
    printf("done\n");
    return 0;
}

sqlite3数据库test.db中的信息:

换成代码体现:

1.编译:gcc b.c -lsqlite3

2.运行:./a.out test.db

代码示例2:

功能描述:实现一条建立表格并且插入数据的指令

//c.c
#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>

static 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],(char *)column_value[i]);
    }
    printf("========================\n");
    return 0 ;// 数据库中有几条数据它回调函数就会调用几次
}
int main(int argc,char **argv)
{
    sqlite3 *db = NULL;
    int ret = 0;
    char *errmsg;
    
    char *sql;
//1.参数出错报错
    if(argc<2){
        printf("Uage: %s xxx.db\n",argv[0]);
        exit(-1);
    }
//2.打开数据库
    if((ret = sqlite3_open(argv[1],&db)) == SQLITE_OK){
        printf("ret = %d   create %s success\n",ret,argv[1]);
    }else{
        printf("ret = %d   creat %s fail\n",ret,argv[1]);
        printf("error num = %d  error mesg:%s\n",sqlite3_errcode(db),sqlite3_errmsg(db));
        if(ret==14){
            printf("permisson deny\n");
        }
        exit(-1);
    }
	/* Create SQL statement */
    sql = "create table class1(id Integer,name char,score Integer);" \
        "insert into class1 values(211,'sun',99);" \
        "select * from class1;";

    /* Execute SQL statement */
    ret = sqlite3_exec(db,sql,callback,"into callback",&errmsg);
    if( ret != SQLITE_OK ){
       // printf("ret = %d error message %s\n",ret,errmsg);
        fprintf(stderr, "SQL error: %s\n", errmsg);
        sqlite3_free(errmsg);
    }else{
        fprintf(stdout, "Records created successfully\n");
    }

    printf("Done\n");
    sqlite3_close(db);

    return 0;
}

结果:

1.编译:gcc c.c -lsqlite3

2.运行:./a.out a.db

3.SELECT操作

下面的 C 代码段显示了如何从前面创建的class1表中获取并显示记录:

以下操作其实在上文已经体现出来,下面的操作了解即可。

//test1.c
#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>

static int callback(void *arg, int column_size, char *column_value[], char*column_name[])
{
    int i ;
    printf("%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(int argc,char **argv)
{

    sqlite3 *db;
    int ret;
    char *sql = NULL;
    char *errmsg = NULL;

    if(argc<2){
        printf("Uage: %s xxx.db\n",argv[0]);
        exit(-1);
    }

    if((ret = sqlite3_open(argv[1],&db)) == SQLITE_OK ){
        printf("ret = %d ,open %s success \n",ret,argv[1]);
    }else{
        printf("ret = %d,error messsge:%s \n",sqlite3_errcode(db),sqlite3_errmsg(db));
        exit(-1);
    }

    sql = "select * from class1";
    ret = sqlite3_exec(db,sql,callback,"into callback",&errmsg);
    printf("ret = %d,error messsge:%s \n",ret,errmsg);
    sqlite3_close(db);

    return 0 ;
}

4.UPDATE操作

下面的 C 代码段显示了如何使用 UPDATE 语句来更新任何记录,然后从class1表中获取并显示更新的记录:

update class1 set name = 'lihua' where id = 211;

代码:

//test2.c
#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>

int callback(void *arg, int column_size, char *column_value[], char*column_name[])
{
    int i ;
    printf("%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(int argc,char **argv)
{

    sqlite3 *db;
    int ret;
    char *sql = NULL;
    char *errmsg = NULL;

    if(argc<2){
        printf("Uage: %s xxx.db\n",argv[0]);
        exit(-1);
    }

    if((ret = sqlite3_open(argv[1],&db)) == SQLITE_OK ){
        printf("ret = %d ,open %s success \n",ret,argv[1]);
    }else{
        printf("ret = %d,error messsge:%s \n",sqlite3_errcode(db),sqlite3_errmsg(db));
        exit(-1);
    }
/*******************************
    先查看class1表里面有什么数据
	调用update 更新一条数据
    再次查看class1表里面的数据
********************************/
    sql = "select * from class1;" \
        "update class1 set name = '李明' where id = 211;"\
        "select * from class1;";

    ret = sqlite3_exec(db,sql,callback,"into callback",&errmsg);//获取错误码,和错误信息
    if( ret != SQLITE_OK ){
        //fprintf(stderr, "SQL error: %s\n", errmsg);
        printf("ret = %d,error messsge:%s \n",ret,errmsg);
        sqlite3_free(errmsg);
    }else{
        fprintf(stdout, "Operation done successfully\n");
    }
    sqlite3_close(db);

    return 0 ;
}

5.DELETE操作

下面的 C 代码段显示了如何使用 DELETE 语句删除任何记录,然后从 class1 表中获取并显示剩余的记录:

删除表中的数据:

delete from stu where id = 211;

代码:

#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>

int callback(void *arg, int column_size, char *column_value[], char*column_name[])
{
    int i ;
    printf("%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(int argc,char **argv)
{

    sqlite3 *db;
    int ret;
    char *sql = NULL;
    char *errmsg = NULL;

    if(argc<2){
        printf("Uage: %s xxx.db\n",argv[0]);
        exit(-1);
    }

    if((ret = sqlite3_open(argv[1],&db)) == SQLITE_OK ){
        printf("ret = %d ,open %s success \n",ret,argv[1]);
    }else{
        printf("ret = %d,error messsge:%s \n",sqlite3_errcode(db),sqlite3_errmsg(db));
        exit(-1);
    }

/*******************************
    先查看class1表里面有什么数据
	调用delete 删除一条数据
    再次查看class1表里面的数据
********************************/
    sql = "select * from class1;" \
        "delete from class1 where id = 211;"\
        "select * from class1;";

    ret = sqlite3_exec(db,sql,callback,"into callback",&errmsg);//获取错误码,和错误信息
    if( ret != SQLITE_OK ){
        //fprintf(stderr, "SQL error: %s\n", errmsg);
        printf("ret = %d,error messsge:%s \n",ret,errmsg);
        sqlite3_free(errmsg);
    }else{
        fprintf(stdout, "Operation done successfully\n");
    }
    sqlite3_close(db);

    return 0 ;
}

对嵌入式SQLite数据库的学习,圆满收官!!

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

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

相关文章

C# Unity 面向对象补全计划 之 接口

本文仅作学习笔记与交流&#xff0c;不作任何商业用途&#xff0c;作者能力有限&#xff0c;如有不足还请斧正 本系列旨在通过补全学习之后&#xff0c;给出任意类图都能实现并做到逻辑上严丝合缝 1.接口 在 C# 中&#xff0c;接口&#xff08;interface&#xff09;是一种定义…

高效PPT制作,一键完成——四大AIPPT工具推荐

在现代社会&#xff0c;PPT已经成为职场人士必备的技能之一。如今&#xff0c;随着人工智能技术的发展&#xff0c;AI制作PPT的工具应运而生。今天&#xff0c;就为大家推荐四款实用的AIPPT工具&#xff0c;让你轻松提升工作效率。 一、笔灵AIPPT 链接&#xff1a;https://ib…

Deep Updated Subspace Networks for Few-Shot RSSC

这篇文章介绍了子空间的概念&#xff0c;然后将query set的特征和预测概率与Support set的特征混合到一起来减少遥感场景图像背景复杂的影响。我觉得主要的创新点还是在特征混合这一块&#xff0c;下图是总体框架图&#xff1a; 特征混合的公式为&#xff1a; 其中的表示第C个类…

什么是图像噪声

" 声明&#xff1a;此文档中的大部分内容来源于网络&#xff0c;经校对和整理后分享给大家&#xff0c;仅供学习参考使用。" 1、什么是图像噪声 维基百科的定义&#xff1a;图像噪声&#xff08;image noise&#xff09;是图像中一种亮度或颜色信息的随机变化(被拍摄…

Error “[object Object]“ when using LangChain‘s AzureChatOpenAI in Node.js

题意&#xff1a;在Node.js中使用LangChain库的AzureChatOpenAI功能时遇到错误“Error [object Object]” 问题背景&#xff1a; Im attempting to use LangChains AzureChatOpenAI with the gpt-35-turbo-16k model in a Node.js application to create an OpenAI Function A…

c++ - 模拟实现set、map

文章目录 前言一、set模拟实现二、map模拟实现 前言 在C标准库中&#xff0c;std::set 和 std::map都是非常常用的容器&#xff0c;它们提供了基于键值对的存储和快速查找能力。然而&#xff0c;关于它们的底层实现&#xff0c;C标准并没有强制规定具体的数据结构&#xff0c;只…

【数据结构】——链式二叉树

目录 一、链式二叉树的定义结构 二、链式二叉树的遍历 2.1前序遍历 2.2中序遍历 2.3后序遍历 2.4层序遍历 三、链式二叉树的基本功能函数 3.1结点个数 3.2叶子结点个数 3.3二叉树第k层结点个数 3.4查找值为x的结点 3.5二叉树的销毁 四、基础OJ 4.1二叉树遍历 4.2…

2023-2024年 Java开发岗面试题经验分享

在各行各业中&#xff0c;面试前我们总会思索一个问题&#xff1a;究竟什么样的求职者能获得面试官的青睐&#xff1f;作为求职者&#xff0c;我们又该如何准备&#xff0c;以应对各种面试官的挑战&#xff1f;在这激烈的竞争里&#xff0c;如何才能让自己从众多应聘者中脱颖而…

镭速FTP替代升级页面助力企业创造新创安全运行环境

在当今快速发展的信息技术环境和日益严峻的网络安全挑战下&#xff0c;企业面临着数据传输和文件管理方面的重大挑战。特别是在信创环境下&#xff0c;传统的FTP已逐渐无法满足现代企业的需求&#xff0c;这促使企业寻求更高效、安全的替代方案。 企业在信创环境运行中的挑战 …

(ICLR-2024)PIXART-α:扩散Transformer的快速训练,用于逼真的文本到图像合成

PIXART-α&#xff1a;扩散Transformer的快速训练&#xff0c;用于逼真的文本到图像合成 Paper Title:PIXART-α: FAST TRAINING OF DIFFUSION TRANSFORMER FOR PHOTOREALISTIC TEXT-TO-IMAGE SYNTHESIS Paper是华为诺亚方舟实验室发表在ICLR 2024的工作 Paper地址 Code地址 项…

由浅入深的了解进程(4)

进程 1、优先级1、1、什么是优先级1、2、为什么需要优先级1、3、Linux优先级的特点和查看方式 2、补充概念3、命令行参数4、环境变量 1、优先级 1、1、什么是优先级 和生活中的概念其实是差不多的。优先级在进程中的定义是指定进程获得CPU资源的先后顺序。如果换一个视角的话…

ATF加载自定义镜像

实际上包含了两个问题&#xff1a; 如何把自定义的二进制文件打包到fip.bin中&#xff1f;如何在secure boot流程中load和认证自定义的二进制文件&#xff1f; 如何打包 证书创建工具和FIP打包工具是通过命令行传参的方式进行证书创建和打包的&#xff0c;如下&#xff1a; …

图新地球-新图源来一波(地表覆盖物、地表水、岩土圈)

0.序 以前的GlobalLand30图源不可访问了&#xff0c;很多需要地物分类的朋友很苦恼。 现在星图新上了一批图源&#xff0c;不仅包括地物分类、水域、还包括土壤酸碱度、有机碳、粘土、阳离子等各种岩土相关的地图服务。 这边全部配置成了图新地球可以直接加载的图源&#xff…

人生总会有自认为迈不过去的坎【西藏旅记1】

人生总会有自认为迈不过去的坎 孤独&#xff0c;也是人生一态。 有两个人说过我这样的性格&#xff0c;不会有真正的朋友&#xff0c;一个是旅行时的领队&#xff0c;另一个也是旅行时的领队。 以他们的视角&#xff0c;形形色色的人&#xff0c;应接不暇的景&#xff0c;他们修…

Github 2024-08-01 开源项目日报Top10

根据Github Trendings的统计,今日(2024-08-01统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量非开发语言项目3Go项目2Python项目2C项目1C#项目1Rust项目1TypeScript项目1编程面试大学:成为软件工程师的全面学习计划 创建周期:2859 天协议…

如何基于欧拉系统完成本地软件仓库安装

挂载 [rootlocalhost ~]# mount /dev/sr0/openeuler/ 查看一下 在脚本里添加以下两行 [rootlocalhost ~]# vim /etc/rc.d/rc.local 给一个可执行权限&#xff0c;并重启 [rootlocalhost ~]# chmod x /etc/rc.d/rc.local [rootlocalhost ~]# reboot 记住挂载点 切换到 /et…

CANoe系统变量模块里定义的结构体类型和变量从CAPL代码角度理解

CAPL里声明一个结构体类型&#xff1a; variables {struct DoIPMessage{byte version;byte inVersion;word type;dword length;byte payload[1500];};struct DoIPMessage doipMessage; }声明一个结构体类型DoIPMessage&#xff0c;定义了一个此结构体…

【C语言】C语言期末突击/考研--指针(一篇就够)

目录 一、指针的本质&#xff08;间接访问原理&#xff09; 1.1.指针的定义 1.2.取地址操作符与取值操作符&#xff0c;指针本质 二、指针的传递使用场景 2.1.什么是指针的传递 2.2.指针的传递使用场景 三、指针的偏移使用场景 3.1.指针的偏移 3.2.指针与一维数组 四…

风景视频素材高清无水印的网站有哪些?6个热门素材网站分享

高清无水印风景视频素材网站推荐&#xff0c;让您的视频内容独树一帜&#xff01; 对于视频创作者来说&#xff0c;一段引人入胜的风景视频素材往往能够瞬间抓住观众的注意力&#xff0c;仿佛将他们带入了一个全新的世界。然而&#xff0c;很多创作者在实际拍摄过程中会面临时…

(二)springboot2.7.6集成activit5.23.0之集成设计器

引入官方流程设计器 1. activiti-webapp-explorer2-5.23.0.war项目并解压。 2.将文件夹diagram-viewer和editor-app以及modeler.html拷贝到项目resources/static目录下&#xff1a; 顺便说一下&#xff1a; 在Spring Boot中&#xff0c;静态资源的访问顺序是先找static&#…