SQLite 用C语言开发的原因有哪些?

news2024/12/23 23:12:46

SQLite 用C语言开发的原因有哪些?

  • 一、引言
    • 1.1、SQLite是什么?
    • 1.2、SQLite的历史和现状
  • 二、SQLite的优点
  • 三、使用C语言开发SQLite的原因
    • 3.1、C 语言的优势
    • 3.2、对比其他编程语言
  • 四、SQLite与其他数据库的对比
    • 4.1、关系型数据库MySQL
    • 4.2、关系型数据库PostgreSQL
    • 4.3、非关系型数据库MongoDB
    • 4.4、非关系型数据库Redis
  • 五、SQLite在实际项目中的应用
  • 六、c语言使用SQLite的示例
  • 七、结论

一、引言

1.1、SQLite是什么?

SQLite是一个开源的关系型数据库管理系统,它以轻量级、嵌入式、零配置、可移植性和高性能等特点而著称。SQLite不需要单独的服务器进程或系统,它可以直接使用本地文件进行数据存储和访问,支持多种操作系统和编程语言。SQLite常被用来作为小型应用程序或嵌入式系统中的数据库解决方案。

官方下载地址:
SQLite Download Page

在这里插入图片描述

1.2、SQLite的历史和现状

SQLite 是一种轻量级的关系型数据库管理系统 (RDBMS),它拥有许多优点,如易于使用、可嵌入、跨平台等。SQLite 最初由 D. Richard Hipp 在 2000 年开发,它最初是为了解决一个名为 AT&T 经典 awk 的工具需要一个内置的数据存储引擎而设计的。
自从 SQLite 发布以来,它已经成为了许多应用程序的首选数据库之一。它被广泛应用于本地存储、移动设备开发、桌面应用程序和 Web 应用程序中。SQLite 目前支持 ANSI SQL 标准的大部分语法,并且可以通过 C/C++、Java、Python 等语言进行访问。
除了其在应用程序中的广泛应用,SQLite 还逐渐成为了其他 RDBMS 的替代品。SQLite 拥有轻量级、可嵌入、易于维护等特点,与传统的关系型数据库相比,SQLite 更适合于小型项目和嵌入式应用程序。
SQLite 的现状非常良好。它仍然是一个活跃的开源项目,每年都会发布多个版本,以改进其性能和功能。SQLite 的最新版增加了全文搜索、JSON 支持、外键约束等新功能,这使得 SQLite 成为了一个更完整的 RDBMS。同时,SQLite 也在不断地扩展它的使用场景,如增加对多线程访问的支持、提供 WAL 模式等。

二、SQLite的优点

  1. 轻量级:SQLite是一个小型的数据库管理系统,体积很小,可以轻松地集成到任何应用程序中。
  2. 简单易用:SQLite不需要繁琐的服务器配置和管理,也不需要复杂的安装过程,只需要使用一些简单的SQL命令就可以进行操作。
  3. 全平台支持:SQLite支持大多数流行的操作系统,包括Windows、Mac OS X、iOS、Android等。
  4. 不需要网络连接:SQLite是一种本地数据库管理系统,不需要网络连接或服务器,可以在离线状态下使用。
  5. 安全性高:SQLite支持数据加密,可以保障数据的安全性。
  6. 性能优异:SQLite是一种高性能的数据库管理系统,具有快速的读写速度,适合于小规模的数据存储和处理。
  7. 可移植性强:SQLite数据文件可以跨越多个平台和操作系统,非常便于备份和恢复。

总结起来就是:快速、轻量级、无需安装、易于使用、跨平台支持。

三、使用C语言开发SQLite的原因

3.1、C 语言的优势

c语言具有性能高、跨平台支持、应用广泛等优势。

  1. 通用性:C语言可以被用于编写各种类型的应用程序,包括操作系统、嵌入式系统、游戏、桌面应用程序、网络应用程序等。
  2. 性能高:C语言是一种底层语言,可以直接访问计算机硬件资源和操作系统API。因此,C语言的执行速度非常快。
  3. 可移植性强:由于C语言是一种通用性很强的语言,它可以在不同的平台上编译和运行,因此具有较好的可移植性。可以跨平台支持。
  4. 灵活性高:C语言提供了很多强大的控制结构和数据类型,可以轻松实现复杂的算法和数据结构。
  5. 开源社区活跃:C语言的开源社区非常活跃,有许多优秀的开源项目、库和工具,可以方便地使用和学习。
    在这里插入图片描述

3.2、对比其他编程语言

(1)和python比较:

  1. 更高的性能:C语言是一种底层语言,直接运行在计算机硬件上,因此执行速度更快,能够处理更大量的数据和更复杂的计算。
  2. 更小的内存占用:C语言开发的SQLite库比Python实现的版本更加轻巧,占用更少的内存资源。
  3. 更好的跨平台兼容性:由于C语言是一种编译型语言,开发的程序可以在多个平台上编译,而Python需要安装解释器才能运行,这使得C语言开发的SQLite具有更好的跨平台兼容性。
  4. 更简洁的代码:C语言是一种较为底层的语言,其代码更加精简,可读性更强,易于维护和调试。
  5. 更好的扩展性:C语言作为一种系统级语言,可以更方便地与其他语言进行集成,如通过调用DLL动态链接库、SO共享库等方式来扩展应用程序。而Python则需要通过C扩展模块或者cython等方式来实现。
    在这里插入图片描述

(2)和Java比较:

  1. 更高的执行速度:C语言是一种底层语言,直接运行在计算机硬件上,相对于Java虚拟机(JVM)解释执行的方式,C语言的执行速度更快,特别是对于大量数据、复杂计算等场景。
  2. 更小的内存占用:C语言开发的SQLite库比Java实现的版本更加轻巧,占用更少的内存资源,可以在资源受限的环境下运行。
  3. 更好的跨平台兼容性:由于C语言是一种编译型语言,开发的程序可以在多个平台上编译,而Java需要JVM来进行执行,因此C语言开发的SQLite具有更好的跨平台兼容性。
  4. 更好的系统级编程能力:C语言是一种系统级语言,可以更方便地与操作系统交互,实现更底层的编程功能,如文件操作、网络通信等,适合需要高度掌控应用程序和系统的需求。
  5. 更简洁的代码:C语言是一种较为底层的语言,其代码更加精简,可读性更强,易于维护和调试。而Java的语法和面向对象的特性较为复杂,需要更多的代码量和理解成本。

    在这里插入图片描述

(3)和C#比较:

  1. 更高的执行速度:C语言是一种底层语言,直接运行在计算机硬件上,相对于C#虚拟机(CLR)解释执行的方式,C语言的执行速度更快,特别是对于大量数据、复杂计算等场景。
  2. 更小的内存占用:C语言开发的SQLite库比C#实现的版本更加轻巧,占用更少的内存资源,可以在资源受限的环境下运行。
  3. 更好的跨平台兼容性:由于C语言是一种编译型语言,开发的程序可以在多个平台上编译,而C#需要CLR来进行执行,因此C语言开发的SQLite具有更好的跨平台兼容性。
  4. 更好的系统级编程能力:C语言是一种系统级语言,可以更方便地与操作系统交互,实现更底层的编程功能,如文件操作、网络通信等,适合需要高度掌控应用程序和系统的需求。
  5. 更广泛的应用领域:C语言广泛应用于系统级编程、嵌入式设备、游戏引擎等领域,在这些领域中,C#相对较少使用。如果需要将SQLite集成到这些领域的应用中,使用C语言开发更具有优势。

    在这里插入图片描述

四、SQLite与其他数据库的对比

4.1、关系型数据库MySQL

SQLite和MySQL都是关系型数据库管理系统,但在一些方面有所不同。

  1. 数据库规模:SQLite适合小型的个人或嵌入式设备上使用。而MySQL则适用于中大型应用程序的数据库管理。
  2. 多用户支持:SQLite缺乏多用户并发控制功能,只能一个用户写入或读取数据,因此不适合高并发的Web应用。而MySQL可以支持多线程并发访问。
  3. 性能:SQLite比MySQL在简单查询和单用户操作时更快,但在复杂查询和大并发请求时,MySQL具有更好的性能表现。
  4. 配置和部署:SQLite无需安装和配置,只需要引入库文件即可使用;而MySQL则需要安装和配置,需要专门的服务器和管理员来维护。
  5. 扩展性:MySQL支持通过插件扩展功能,而SQLite则不支持。
  6. 安全性:MySQL具有更好的安全特性,如权限管理、加密传输等。而SQLite则相对较少,因为它通常用于本地存储和轻量级应用程序。

    在这里插入图片描述

4.2、关系型数据库PostgreSQL

SQLite是一种轻量级的嵌入式关系型数据库,适用于小型应用程序。而PostgreSQL是一个成熟的关系型数据库管理系统,其拥有更多的高级特性和功能。

  1. 数据库大小限制:SQLite的数据库大小限制为2GB,而PostgreSQL没有明确的数据库大小限制。
  2. 并发控制:PostgreSQL采用了MVCC(多版本并发控制)技术,可以有效地处理高并发环境下的数据读写操作。而SQLite则采用了简单的读写锁机制。
  3. 支持的数据类型:PostgreSQL支持更多的数据类型,如数组、JSON等。SQLite则只支持基本的数据类型。
  4. 引擎支持:PostgreSQL支持多种存储引擎,如B-tree、Hash、GiST等。而SQLite只有自己的存储引擎。
  5. 扩展性:PostgreSQL具有很高的扩展性,可以通过插件来添加新的功能,并支持多种编程语言接口。而SQLite相对较少的扩展性,只能通过C语言接口进行扩展。

如果需要处理大规模的数据和高并发请求,或者需要更多的高级特性和扩展性,那么PostgreSQL是更好的选择。而如果只是处理小型应用程序,SQLite则是一种更轻量级的选项。

4.3、非关系型数据库MongoDB

  1. 数据模型:SQLite是一个关系型数据库,使用表来存储数据。它支持SQL查询语言,并且具有ACID事务支持。而MongoDB则是一种文档数据库,使用集合来存储数据。它使用JSON格式存储数据,可以轻松地表示复杂的数据结构。
  2. 扩展性:SQLite被设计为单机数据库,不支持分布式部署。而MongoDB支持分布式部署,并在大型、高并发应用中表现出色。
  3. 性能:由于SQLite是一个本地文件系统数据库,因此读写速度非常快。它适合小型应用程序,但对于大型应用程序来说可能会受到瓶颈影响。而MongoDB的性能则取决于集群环境和配置,但它通常比SQLite更适合处理大量数据。
  4. 存储空间:由于MongoDB使用JSON格式存储数据,所以通常比SQLite需要更多的磁盘空间。但在处理大型数据时,MongoDB的压缩机制可以节省大量存储空间。
  5. 数据库管理:SQLite只需要安装一个文件即可使用,非常简单。而MongoDB需要安装服务器并进行配置,这可能需要一定的技术知识。

SQLite更适合小型应用程序和单机使用,而MongoDB则更适合大型应用程序和分布式环境。

4.4、非关系型数据库Redis

  1. 数据存储方式:SQLite是关系型数据库,使用SQL作为查询语言,数据存储在表格中;而Redis是键值存储数据库,不支持SQL,数据以键值对的形式存储。
  2. 数据类型:SQLite支持多种数据类型,包括字符串、整数、浮点数、日期时间等;而Redis只支持简单的字符串类型。
  3. 数据处理速度:由于Redis是内存型数据库,因此它的速度比SQLite更快。SQLite需要从磁盘读取数据,而Redis则将数据存储在内存中,可以快速读取数据。
  4. 连接并发性:SQLite只能支持一个连接,因此在高并发的环境中,可能会出现性能问题。而Redis能够同时处理多个连接请求,可以满足高并发的要求。
  5. 数据安全性:SQLite支持事务处理和ACID属性,可以确保数据的完整性和一致性。而Redis不支持事务处理和ACID属性,可能导致数据风险。
    在这里插入图片描述

五、SQLite在实际项目中的应用

  1. 移动应用开发:在移动应用开发中,SQLite通常用于存储和管理应用本地数据,如用户信息、配置信息、缓存数据等。它可以轻松地处理大量数据,并支持复杂查询和排序操作。此外,作为移动应用的核心组件之一,SQLite还可以与其他技术和框架配合使用,如ORMLite、GreenDAO、Room等,以提高开发效率。
  2. 桌面应用开发:SQLite在桌面应用开发中的应用非常广泛,它可以提供可靠的本地数据存储和管理功能,同时保持高效和灵活性。比如数据库管理工具、电子邮件客户端、聊天程序等。
  3. Web应用开发:SQLite在Web开发中的应用非常灵活,它可以提供可靠的本地数据存储和管理功能,同时保持高效和灵活性。但是需要注意的是,对于大型Web应用程序,通常需要更强大的数据库解决方案以满足需求。比如博客平台平台。

六、c语言使用SQLite的示例

SQLite源码官方下载地址:下载
以下是一个基本的 C 语言程序,用于连接 SQLite 数据库、创建表、插入数据和查询数据:

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

int main(void) {
  sqlite3 *db;
  char *err_msg = 0;

  int rc = sqlite3_open("test.db", &db);

  if (rc != SQLITE_OK) {
    fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));
    sqlite3_close(db);
    return 1;
  }

  char *sql = "CREATE TABLE IF NOT EXISTS users(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INT);";

  rc = sqlite3_exec(db, sql, 0, 0, &err_msg);

  if (rc != SQLITE_OK ) {
    fprintf(stderr, "无法创建表: %s\n", err_msg);
    sqlite3_free(err_msg);
    sqlite3_close(db);
    return 1;
  }

  char *insert_sql = "INSERT INTO users(name, age) VALUES('Tom', 20);"
  
  rc = sqlite3_exec(db, insert_sql, 0, 0, &err_msg);

  if (rc != SQLITE_OK ) {
    fprintf(stderr, "无法插入数据: %s\n", err_msg);
    sqlite3_free(err_msg);
    sqlite3_close(db);
    return 1;
  }

  char *select_sql = "SELECT * FROM users;"

  sqlite3_stmt *stmt;

  rc = sqlite3_prepare_v2(db, select_sql, -1, &stmt, 0);

  if (rc == SQLITE_OK) {
    while (sqlite3_step(stmt) == SQLITE_ROW) {
      int id = sqlite3_column_int(stmt, 0);
      char *name = sqlite3_column_text(stmt, 1);
      int age = sqlite3_column_int(stmt, 2);
      printf("id: %d, name: %s, age: %d\n", id, name, age);
    }
  } else {
    fprintf(stderr, "无法查询数据: %s\n", sqlite3_errmsg(db));
  }

  sqlite3_finalize(stmt);
  sqlite3_close(db);

  return 0;
}

首先连接数据库(如果不存在则会创建一个新的数据库),然后创建一个名为 users 的表,并插入一条数据,最后查询所有数据并输出。请注意,根据需要,可以修改 SQL 查询语句来筛选和排序结果等。

七、结论

SQLite的优点:

  1. 无服务器架构,易于集成和部署。
  2. 轻量级:SQLite库只有几百KB大小,可以在资源受限的设备上使用。
  3. 支持标准的SQL语言,提供高度可扩展性和灵活性。
  4. 提供事务支持,确保数据的完整性和一致性。
  5. 支持多种编程语言的接口,包括C、Java、Python等。

C语言的优势:

  1. C语言是一种高效、快速的系统级语言,可以直接访问底层硬件资源。
  2. C语言具有广泛的应用领域,包括嵌入式系统、操作系统、游戏开发等。
  3. C语言具有丰富的算法和数据结构库,可以轻松实现复杂的数据处理和计算功能。
  4. C语言具有高度的可移植性,可以在不同的平台上编译运行。
  5. C语言支持面向过程和面向对象编程范式,可以根据需求选择合适的编程方式。

SQLite未来的发展趋势:

  1. 支持更多类型的数据。目前SQLite支持的数据类型比较有限,未来可能会增加对JSON、XML等非结构化数据类型的支持。
  2. 对性能的进一步优化。SQLite已经是一个非常快速和高效的数据库,但是未来还可以通过进一步的优化提升其性能,例如使用更先进的算法和技术,以及更好地利用现代计算机的硬件资源。
  3. 改善并发性能。SQLite当前的并发性能相对较弱,未来可能会引入更好的并发控制机制,提高并发性能。
  4. 支持更多平台和语言。SQLite已经广泛应用于PC、移动端等各种平台,未来可能会支持更多的平台和编程语言,以满足不同场景下的需求。
  5. 更好的安全性和可靠性。SQLite的安全性和可靠性已经得到了广泛认可,未来可能会继续加强这方面的工作,例如支持更好的加密机制、事务处理等。

SQLite未来的发展趋势主要集中在性能、可靠性、安全性和功能方面的不断提升,以满足不同场景下的需求,并且扩大应用范围。

在这里插入图片描述

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

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

相关文章

Python小姿势 - 线程和进程:

线程和进程&#xff1a; Python里面线程是真正的并行执行&#xff0c;进程是可以并行执行的。 所谓进程&#xff0c;就是操作系统中执行一个程序的独立单元&#xff0c;它是系统进行资源分配和调度的基本单位。一个进程可以创建和撤销另一个进程&#xff0c;同一个进程内可以并…

Vue电商项目--axios二次封装

postman测试接口 刚刚经过postman工具测试&#xff0c;发现接口果然发生了改变。 新的接口为http://gmall-h5-api.atguigu.cn 如果服务器返回的数据code字段200&#xff0c;代表服务器返回数据成功 整个项目&#xff0c;接口前缀都有/api字样 axios二次封装 XmlHttpRequ…

EMC VPLEX VS2 FRU故障备件更换基本流程

本文是针对VPLEX VS2 备件更换流程的详细操作方法&#xff0c;其实VS6也是类似的。 首先要说明一点&#xff0c;EMC VPLEX的任何硬件故障更换都不是直接插拔来完成的&#xff0c;一定要执行脚本要完成更换&#xff0c;本文就是描述如何启动这个脚本和常见的一些问题&#xff0…

【react从入门到精通】初识React

文章目录 前言React技能树什么是 React&#xff1f;安装和配置 React创建 React 组件渲染 React 组件使用 JSX传递属性&#xff08;Props&#xff09;处理组件状态&#xff08;State&#xff09;处理用户输入&#xff08;事件处理&#xff09;组合和嵌套组件写在最后 前言 Reac…

群晖传输速度的问题

1、群晖被称“买软件送硬件”&#xff0c;所以同价位NAS中群晖的配置是很低的&#xff0c;一些入门级型号用起来明显卡顿就一点不奇怪了。 群晖各版本的CPU/内存配置可用在官网上查到&#xff0c;一个页面列出了所有产品的CPU/内存配置: 我的 Synology NAS 使用哪种 CPU&#…

【五一创作】Python 一文了解 OS 操作系统交互库简单使用方法

作者主页&#xff1a;爱笑的男孩。的博客_CSDN博客-深度学习,活动,YOLO领域博主爱笑的男孩。擅长深度学习,活动,YOLO,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typecollect个人…

linux系统下C/C++静态库和动态库的制作及使用

C/C静态库和动态库的制作及使用 1 静态库的制作静态库简介1.1 编写源码1.2 生成目标文件1.3 ar归档,打包成静态库1.4 查看静态库1.5 测试静态库1.6 运行测试 2 动态库2.1 编写 Makefile2.2 编译链接动态库 1 静态库的制作 静态库简介 一般情况下&#xff0c;为了更好的支持开…

LC正弦波振荡器【高频电子线路】【Multisim】

目录 一、实验目的与要求 二、实验仪器 三、实验内容与测试结果 1、观察起振过程 2、观测稳定的输出波形及振荡频率的变化 3、测试静态工作点对起振和输出幅度的影响 4、测试回路电容对振荡频率和输出幅度的影响&#xff0c;并理论上给出解释 四、实验结果分析 一、实验…

【社区图书馆】【图书活动第四期】

目录 一、前言 二、作者简介 三、《PyTorch高级机器学习实战》内容简介 四、书目录 一、前言 今天&#xff0c;偶尔逛到csdn社区图书馆&#xff0c;看到有活动 “【图书活动第四期】来一起写书评领实体奖牌红包电子勋章吧&#xff01;”&#xff08;活动到今天结束&#xf…

荔枝派Zero(全志V3S)开启 SSH 实现远程连接和文件传输

文章目录 前言一、配置 buildroot二、编译 buildroot三、拷贝到 SD 卡四、测试 ssh1、修改 /etc/ssh/sshd_config 文件2、运行 /usr/sbin/sshd3、使用 SecureCRT 测试4、使用 SecureFx 测试 前言 本文将在 Buildroot 根文件系统开启 ssh 功能。 一、配置 buildroot 1、在 bui…

《软件测试》[Ron Patton](一)-软件测试背景、软件开发过程、软件测试基础

《软件测试&#xff08;原书第2版&#xff09;》作者: [美] Ron Patton 这本书是软件测试入门的经典书籍。我在刚入行时&#xff0c;也读过这本书&#xff0c;受益匪浅。并且即使是工作了这么多年&#xff0c;再回头看这本书&#xff0c;会发现怎么都逃不出这本书的范围。这个系…

【视频教程解读】Window上安装和使用autogluon V0.4

1.使用conda安装的python环境 教程使用的是极简版miniconda,由于我们的电脑中安装了anaconda&#xff0c;所以不需要进行进一步安装。python版本为3.9&#xff0c;博客里面有anaconda和python版本的对应关系。注意查看版本autogluon V0.4需要3.8或者3.9和3.10&#xff0c;pip版…

Linux:网络基础1

网络协议分层 所有网络问题&#xff0c;本质都是通信距离变长了&#xff0c;为了尽可能减少通信成本&#xff0c;定制了协议。 协议分层的优势&#xff1a; 软件设计方面的优势 - 低耦合 一般我们的分层依据: 功能比较集中&#xff0c;耦合度比较高的模块-- 一层 &#xff0c…

【Vue 基础】尚品汇项目-03-home首页搭建(全局组件与局部组件)

1. 完成三级联动组件&#xff08;全局组件&#xff09; 由于三级联动组件在Home、Search、Detail中都需使用&#xff0c;因此将三级联动组件作为全局组件&#xff0c;这样只需要注册一次&#xff0c;就可以在项目任意地方使用。 新建“home/TypeNav/index.vue”&#xff0c;写…

深度学习技巧应用10-PyTorch框架中早停法类的构建与运用

大家好,我是微学AI,今天给大家介绍一下深度学习技巧应用10-PyTorch框架中早停法类的构建与运用,文章将介绍深度学习训练过程中的一个重要技巧—早停法,以及如何在PyTorch框架中实现早停法。文章将从早停法原理和实践出发,结合实际案例剖析早停法的优缺点及在PyTorch中的应…

[创新工具和方法论]-02- DOE实验设计步骤

文章目录 1.DOE设计1.1 基于OFAT的传统实验设计&#xff1a;1.2 基于DoE的现代实验设计&#xff1a;1.3 DOE和OFAT的比较1.4 如何利用好DOE1.4.1 规划1.4.2 筛选1.4.3 表征1.4.4 优化1.4.5 确认 2. 步骤2.1陈述实际的问题和实验的目的2.2因果链分析,提取重要的因子2.3选择Y的响…

永磁同步电机(PMSM)无传感器控制基于滑膜观测器Matlab/Simulink仿真分析

文章目录 前言一、状态观测器二、滑膜状态观测器2.1.滑膜观测器的原理2.2.传统的滑膜观测器2.3.改进的滑膜观测器 三、Matlab/Simulink仿真分析3.1.仿真电路分析3.1.1 电机控制模式切换3.1.2 速度环控制3.1.3 电流环控制3.1.4 电机主电路 3.2.仿真结果分析 总结 前言 本章节采…

跳跃游戏 (DFS->记忆化搜索->动态规划/贪心证明)

一.跳跃游戏简单介绍 1. 跳跃游戏简单介绍 跳跃游戏是一种典型的算法题目&#xff0c;经常是给定一数组arr&#xff0c;从数组的某一位置i出发&#xff0c;根据一定的跳跃规则&#xff0c;比如从i位置能跳arr[i]步&#xff0c;或者小于arr[i]步&#xff0c;或者固定步数&#…

【HQL - 查询用户的累计消费金额及VIP等级】

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 题目&#xff1a; 从订单信息表(order_info)中统计每个用户截止其每个下单日期的累积消费金额&#xff0c;以及每个用户在其每个下单日期的VIP等级。 用户vip等级根据累积消费金额计算&#xff0…

Unity之OpenXR+XR Interaction Toolkit基本配置

前言 XR Interaction Toolkit 是Unity基于OpenXR标准&#xff0c;发布的一套XR工具&#xff0c;目的是方便我们快速接入XR相关的SDK&#xff0c;并且做到兼容不同VR设备的目的&#xff0c;目前流行的VR设备如Oculus&#xff0c;Metal&#xff0c;HTC Vive&#xff0c;Pico等统…