数据库SQLite的使用

      SQLite是一个C语言库,实现了一个小型、快速、独立、高可靠性、功能齐全的SQL数据库引擎SQLite文件格式稳定、跨平台且向后兼容。SQLite源代码属于公共领域(public-domain),任何人都可以免费将其用于任何目的。源码地址:https://github.com/sqlite/sqlite,最新发布版本为3.47.0。

      SQLite是关系型数据库,与许多其它数据库管理系统不同,SQLite不是一个客户端/服务器结构的数据库引擎,而是被集成在用户程序中。SQLite将整个数据库,包括定义、表、索引以及数据本身,作为一个单独的、可跨平台使用的文件存储在主机中

      SQLite提供了一个叫做sqlite3的独立程序用来查询和管理SQLite数据库文件,可从 https://www.sqlite.org/download.html 下载sqlite-tools-win-x64-3470000.zip获取到。

      所有的SQLite语句可以以任何关键字开始,如SELECT、INSERT、UPDATE、DELETE、ALTER、DROP等,所有的语句通常使用分号;结束

      Windows10上生成SQLite静态库:

      (1).从 https://www.sqlite.org/download.html 下载sqlite-dll-win-x64-3470000.zip和sqlite-amalgamation-3470000.zip

      (2).解压缩到同一目录下:此目录下有sqlite3.dll、sqlite3.def、sqlite3.h、sqlite3.c、sqlite3ext.h、shell.c

      (3).打开"Developer Command Prompt for VS 2022",并将其定位到存放sqlite的目录下,执行如下命令:执行完后会生成sqlite3.lib和sqlite3.exp

lib /DEF:sqlite3.def /OUT:sqlite3.lib /MACHINE:x64

      SQLite开源的可视化工具DB Browser for SQLite(DB4S)的使用:

      1.SQLite数据库浏览器(DB4S)是一款高质量、可视化、开源工具,用于创建、设计和编辑与SQLite兼容的数据库文件。源码地址:https://github.com/sqlitebrowser/sqlitebrowser,license为GPL或类似的开源许可证,最新发布版本为v3.13.1。它是跨平台的,可在Windows、Linux、MacOS等操作系统上使用。DB4S操作:

      (1).创建和压缩数据库文件

      (2).创建、定义、修改和删除表

      (3).创建、定义和删除索引

      (4).浏览、编辑、添加和删除记录(records)

      (5).搜索记录

      (6).以文本形式导入和导出记录

      (7).从CSV文件导入和导出表

      (8).从SQL转储文件(dump files)导入和导出数据库

      (9).SQL查询并检查结果

      2.Windows10上安装DB4S:

      (1).从https://github.com/sqlitebrowser/sqlitebrowser/releases/tag/v3.13.1 下载DB.Browser.for.SQLite-v3.13.1-win64.zip,并解压缩

      (2).双击打开DB Browser for SQLite.exe即可:界面如下:

     

      (1).SQLite是不区分大小写的,但也有一些命令是大小写敏感的。

      (2).SQLite没有一个单独的用于存储日期和/或时间的存储类,但SQLite能够把日期和时间存储为TEXT、REAL或INTEGER值。

      (3).在对当前数据库进行操作(c++)前,需要先关闭DB4S。

      (4).DB4S没有刷新功能,而PostgreSQL的图形界面(pgAdmin 4)有。

      以下为测试代码段

      (1).创建数据库:

int create_database(const std::string& dbname)
{sqlite3* db{ nullptr };auto ret = sqlite3_open(dbname.c_str(), &db); // 如果数据库不存在,则会创建它if (ret != SQLITE_OK)std::cerr << "Error: fail to sqlite3_open: " << ret << ", " << sqlite3_errmsg(db) << std::endl;sqlite3_close(db);return ret;
}

      (2).删除数据库:直接调用C++17中的std::filesystem::remove函数删除类似*.db的文件

int delete_database(const std::string& dbname)
{namespace fs = std::filesystem;fs::path file{ dbname };if (fs::exists(file)) {try {fs::remove(file);}catch (const fs::filesystem_error& e) {std::cerr << "Error: " << e.what() << std::endl;return -1;}} else {std::cerr << "Warning: database file does not exist: " << dbname << std::endl;return -1;}return 0;
}

      (3).创建表:

int create_table(const std::string& dbname, const std::string& command)
{sqlite3* db{ nullptr };auto ret = sqlite3_open(dbname.c_str(), &db);if (ret != SQLITE_OK)std::cerr << "Error: fail to sqlite3_open: " << ret << ", " << sqlite3_errmsg(db) << std::endl;char* errmsg{ nullptr };ret = sqlite3_exec(db, command.c_str(), nullptr, nullptr, &errmsg);if (ret != SQLITE_OK) {std::cerr << "Error: fail to create table: " << ret << ", " << errmsg << std::endl;sqlite3_free(errmsg);}sqlite3_close(db);return ret;
}

      (4).删除表:

int drop_table(const std::string& dbname, const std::string& tablename)
{sqlite3* db{ nullptr };auto ret = sqlite3_open(dbname.c_str(), &db);if (ret != SQLITE_OK)std::cerr << "Error: fail to sqlite3_open: " << ret << ", " << sqlite3_errmsg(db) << std::endl;char* errmsg{ nullptr };const std::string str{ "DROP TABLE " };ret = sqlite3_exec(db, (str+tablename).c_str(), nullptr, nullptr, &errmsg);if (ret != SQLITE_OK) {std::cerr << "Error: fail to drop table: " << ret << ", " << errmsg << std::endl;sqlite3_free(errmsg);}sqlite3_close(db);return ret;
}

      (5).向表中插入数据:

int insert_into_teacher(const std::string& dbname, int id, const std::string& name, const std::string& addr, const std::string& sex)
{sqlite3* db{ nullptr };auto ret = sqlite3_open(dbname.c_str(), &db);if (ret != SQLITE_OK)std::cerr << "Error: fail to sqlite3_open: " << ret << ", " << sqlite3_errmsg(db) << std::endl;char* errmsg{ nullptr };std::string str{ "INSERT INTO teacher (id, name, addr, sex) VALUES (" };str = str + std::to_string(id) + ", '" + name + "', '" + addr + "', '" + sex + "');";ret = sqlite3_exec(db, str.c_str(), nullptr, nullptr, &errmsg);if (ret != SQLITE_OK) {std::cerr << "Error: fail to insert into teacher: " << ret << ", " << errmsg << std::endl;sqlite3_free(errmsg);}sqlite3_close(db);return ret;
}std::string get_current_time()
{auto timenow = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());std::tm* now_tm = std::localtime(&timenow);std::ostringstream oss;oss << std::put_time(now_tm, "%Y-%m-%d %H:%M:%S");return oss.str();
}int insert_into_student(const std::string& dbname, int id, const std::string& name, const std::string& addr, int age,float score, const std::string& date, const std::string& sex)
{sqlite3* db{ nullptr };auto ret = sqlite3_open(dbname.c_str(), &db);if (ret != SQLITE_OK)std::cerr << "Error: fail to sqlite3_open: " << ret << ", " << sqlite3_errmsg(db) << std::endl;char* errmsg{ nullptr };std::string str{ "INSERT INTO student (id, name, addr, age, score, date, sex) VALUES (" };str = str + std::to_string(id) + ", '" + name + "', '" + addr + "'," + std::to_string(age) + "," +std::to_string(score) + ", '" + date + "', '" + sex + "'); ";ret = sqlite3_exec(db, str.c_str(), nullptr, nullptr, &errmsg);if (ret != SQLITE_OK) {std::cerr << "Error: fail to insert into student: " << ret << ", " << errmsg << std::endl;sqlite3_free(errmsg);}sqlite3_close(db);return ret;
}

      (6).向已有表中添加、删除列:

int alter_table(const std::string& dbname)
{sqlite3* db{ nullptr };auto ret = sqlite3_open(dbname.c_str(), &db);if (ret != SQLITE_OK)std::cerr << "Error: fail to sqlite3_open: " << ret << ", " << sqlite3_errmsg(db) << std::endl;char* errmsg{ nullptr };const std::string str{ "ALTER TABLE teacher " };const std::string str1{ "ADD COLUMN hobbies CHAR(64) DEFAULT swim;" };ret = sqlite3_exec(db, (str+str1).c_str(), nullptr, nullptr, &errmsg);if (ret != SQLITE_OK) {std::cerr << "Error: fail to add cloumn: " << ret << ", " << errmsg << std::endl;sqlite3_free(errmsg);}const std::string str2{ "DROP COLUMN addr;" };ret = sqlite3_exec(db, (str + str2).c_str(), nullptr, nullptr, &errmsg);if (ret != SQLITE_OK) {std::cerr << "Error: fail to drop column: " << ret << ", " << errmsg << std::endl;sqlite3_free(errmsg);}sqlite3_close(db);return ret;
}

      (7).删除表中数据:

int delete_table_data(const std::string& dbname)
{sqlite3* db{ nullptr };auto ret = sqlite3_open(dbname.c_str(), &db);if (ret != SQLITE_OK)std::cerr << "Error: fail to sqlite3_open: " << ret << ", " << sqlite3_errmsg(db) << std::endl;char* errmsg{ nullptr };const std::string str{ "DELETE FROM teacher WHERE id > 10000 OR sex='女';" };ret = sqlite3_exec(db, str.c_str(), nullptr, nullptr, &errmsg);if (ret != SQLITE_OK) {std::cerr << "Error: fail to delete data from teachar: " << ret << ", " << errmsg << std::endl;sqlite3_free(errmsg);}sqlite3_close(db);return ret;
}

      (8).调整表中已有数据:

int update_table_data(const std::string& dbname)
{sqlite3* db{ nullptr };auto ret = sqlite3_open(dbname.c_str(), &db);if (ret != SQLITE_OK)std::cerr << "Error: fail to sqlite3_open: " << ret << ", " << sqlite3_errmsg(db) << std::endl;char* errmsg{ nullptr };const std::string str1 = std::string("UPDATE teacher SET sex = 'man' WHERE sex = ") + "\'" + gbk_to_utf8("男") + "\';";ret = sqlite3_exec(db, str1.c_str(), nullptr, nullptr, &errmsg);if (ret != SQLITE_OK) {std::cerr << "Error: fail to update data from teachar: " << ret << ", " << errmsg << std::endl;sqlite3_free(errmsg);}const std::string str2 = std::string("UPDATE teacher SET sex = ") + "\'" + gbk_to_utf8("女") + "\'" + " WHERE sex = 'woman';";ret = sqlite3_exec(db, str2.c_str(), nullptr, nullptr, &errmsg);if (ret != SQLITE_OK) {std::cerr << "Error: fail to update data from teachar: " << ret << ", " << errmsg << std::endl;sqlite3_free(errmsg);}sqlite3_close(db);return ret;
}

      (9).查询表中数据:

int select_table_data(const std::string& dbname)
{sqlite3* db{ nullptr };auto ret = sqlite3_open(dbname.c_str(), &db);if (ret != SQLITE_OK)std::cerr << "Error: fail to sqlite3_open: " << ret << ", " << sqlite3_errmsg(db) << std::endl;const std::string query{ "SELECT * FROM student WHERE age >= 20 AND DATETIME(date) > DATETIME('2024-11-07 17:54:30');" };char* errmsg{ nullptr };sqlite3_stmt* stmt{ nullptr };ret = sqlite3_prepare_v2(db, query.c_str(), -1, &stmt, 0);if (ret != SQLITE_OK) {std::cerr << "Error: fail to sqlite3_prepare_v2: " << ret << ", " << sqlite3_errmsg(db) << std::endl;return ret;}std::cout << "id\tname\taddr\tage\tscore\tdate\t\t\t\tsex" << std::endl;while (sqlite3_step(stmt) == SQLITE_ROW) {auto id = sqlite3_column_int(stmt, 0);auto name = utf8_to_gbk(std::string(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 1))));auto addr = utf8_to_gbk(std::string(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 2))));auto age = sqlite3_column_int(stmt, 3);auto score = sqlite3_column_double(stmt, 4);auto date = std::string(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 5)));auto sex = utf8_to_gbk(std::string(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 6))));std::cout << id << "\t" << name << "\t" << addr << "\t" << age << "\t" << score << "\t"<< date << "\t\t" << sex << std::endl;}sqlite3_finalize(stmt);sqlite3_close(db);return ret;
}

      全局变量设置如下:

const std::string table_teacher{ "CREATE TABLE teacher (""id INTEGER PRIMARY KEY NOT NULL CHECK(id>1000),""name TEXT NOT NULL,""addr TEXT DEFAULT 'BeiJing',""sex TEXT NOT NULL);" };
const std::string table_student{ "CREATE TABLE student (""id INTEGER PRIMARY KEY NOT NULL,""name CHAR(32) NOT NULL,""addr CHAR(64) DEFAULT 'TianJin',""age INTEGER,""score REAL,""date CHAR(24),""sex CHAR(8) NOT NULL);" };

      SQLite中没有实现类似libpqxx中的set_client_encoding函数,如果表中数据有中文则会显示乱码,这里实现utf8和gbk之间的转换:

inline std::string gbk_to_utf8(const std::string& str)
{
#ifdef _MSC_VER// gbk to wcharauto len = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, nullptr, 0);std::wstring wstr(len, 0);::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, &wstr[0], len);// wchar to utf8len = ::WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, nullptr, 0, nullptr, nullptr);std::string u8str(len, 0);::WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, &u8str[0], len, nullptr, nullptr);u8str.pop_back(); // remove '\0'return u8str;
#elsereturn std::string{"Unimplemented"};
#endif
}inline std::string utf8_to_gbk(const std::string& u8str)
{
#ifdef _MSC_VER// utf8 to wcharauto len = ::MultiByteToWideChar(CP_UTF8, 0, u8str.c_str(), -1, nullptr, 0);std::wstring wstr(len, 0);::MultiByteToWideChar(CP_UTF8, 0, u8str.c_str(), -1, &wstr[0], len);// wchar to gbklen = ::WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, nullptr, 0, nullptr, nullptr);std::string str(len, 0);::WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, &str[0], len, nullptr, nullptr);str.pop_back(); // remove '\0' return str;
#elsereturn std::string{"Unimplemented"};
#endif
}

      主函数如下:

int test_sqlite()
{const std::string dbname{ "info.db" };//create_database(dbname);delete_database(dbname);create_table(dbname, table_teacher);create_table(dbname, table_student);//drop_table(dbname, "teacher");//drop_table(dbname, "student");insert_into_teacher(dbname, 1111, gbk_to_utf8("Tom"), gbk_to_utf8("HeBei"), gbk_to_utf8("man"));insert_into_teacher(dbname, 5555, gbk_to_utf8("Tom"), gbk_to_utf8("北京"), gbk_to_utf8("男"));insert_into_teacher(dbname, 2222, gbk_to_utf8("小张"), gbk_to_utf8("天津"), gbk_to_utf8("woman"));insert_into_teacher(dbname, 16625, gbk_to_utf8("小王"), gbk_to_utf8("Tianjin"), gbk_to_utf8("女"));insert_into_student(dbname, 8, gbk_to_utf8("小王"), gbk_to_utf8("HeBei"), 32, 88.8f, get_current_time(), gbk_to_utf8("男"));insert_into_student(dbname, 28, gbk_to_utf8("小何"), gbk_to_utf8("深圳"), 8, 22.22f, get_current_time(), gbk_to_utf8("女"));std::this_thread::sleep_for(std::chrono::minutes(1));insert_into_student(dbname, 29, gbk_to_utf8("Lucy"), gbk_to_utf8("北京"), 18, 22.22f, get_current_time(), gbk_to_utf8("woman"));insert_into_student(dbname, 33, gbk_to_utf8("Tom"), gbk_to_utf8("深圳"), 28, 22.22f, get_current_time(), gbk_to_utf8("woman"));insert_into_student(dbname, 18, gbk_to_utf8("小李"), gbk_to_utf8("上海"), 28, 66.6f, get_current_time(), gbk_to_utf8("女"));std::this_thread::sleep_for(std::chrono::seconds(5));insert_into_student(dbname, 48, gbk_to_utf8("Tom"), gbk_to_utf8("深圳"), 38, 22.22f, get_current_time(), gbk_to_utf8("woman"));alter_table(dbname);delete_table_data(dbname);update_table_data(dbname);select_table_data(dbname);return 0;
}

      执行结果如下:

      DB4S显示内容如下:

      GitHub:https://github.com/fengbingchun/Messy_Test

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

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

相关文章

【大咖云集,院士出席 | ACM独立出版】第四届大数据、人工智能与风险管理国际学术会议 (ICBAR 2024,11月15-17日)--冬季主会场

第四届大数据、人工智能与风险管理国际学术会议 (ICBAR 2024)--冬季主会场 2024 4th International Conference on Big Data, Artificial Intelligence and Risk Management 官方信息 会议官网&#xff1a;www.icbar.net 2024 4th International Conference on Big Data, Art…

图像算法之 OCR 识别算法:原理与应用场景

一、引言 在当今数字化时代&#xff0c;图像信息的处理和识别变得越来越重要。光学字符识别&#xff08;Optical Character Recognition&#xff0c;OCR&#xff09;算法作为一种能够将图像中的文字转换为可编辑文本的技术&#xff0c;正广泛应用于各个领域。从文档数字化到自…

SQLite的BLOB数据类型与C++二进制存储学习记录

一、BLOB数据类型简介 Blob&#xff08;Binary Large Object&#xff09;是一种用于存储二进制数据的数据类型&#xff0c;在数据库中常用于存储图片、音频和视频等大型&#xff08;大数据量&#xff09;的二进制数据[1-2]。需要注意的是&#xff0c;SQLite中BLOB类型的单对象最…

python基础——05函数

一、函数 1.1 函数定义 函数定义&#xff1a;实现特定功能的代码块 函数的作用&#xff1a; 简化代码提高代码重用性便于维护和修改可提高代码的可拓展性 函数三要素&#xff1a;功能、参数、返回值 函数定义的语法格式&#xff1a; 函数分类&#xff1a; 从定义的角度—…

[Redis] Redis哨兵机制

&#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与…

【Eclipse系列】eclipse安装与常规配置(含插件)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、下载与安装 二、常规设置 1.1.设置工作空间(workspace) 1.2.设置字体和字体大小 ​编辑 1.3.设置编码 1.4.去除验证(validation) 1.5.去除单词验证(spelli…

注册登录学生管理系统小项目

头文件 #ifndef _LOGINLINK_H_ #define _LOGINLINK_H_ #include<myhead.h> typedef struct {int id;char name[20];int age; }stu,*Pstu; typedef struct node {union{int len;stu data;};struct node *next; }node,*Pnode; int regist(); int login(); Pnode create()…

【在clion中构建python interpreter环境用于debug fastlio2】

在CLION中构建python interpreter环境 数据包在clion中构建python interpreter环境 数据包 数据包链接&#xff1a;fastlio2_ros2 在clion中构建python interpreter环境 通过clion中的remote development 通过SSH远程构建fastlio2 workspace 打开远程clion工作空间后&#x…

HTML+CSS基础【快速上手】

目录 一、HTML展示 1、HTML基础结构 2、认识元素属性 &#xff08;1&#xff09;元素属性理解 &#xff08;2&#xff09;实例 3、自结束标签和注释 &#xff08;1&#xff09;自结束标签 &#xff08;2&#xff09;注释 4、语义化标签 &#xff08;1&#xff09;语义…

6000字加图文 | 抓包带你深入了解网关到底起什么样的作用?不同网段通信的过程详解

不同网段通信的过程 不同网段就分两种了&#xff0c;同一个局域网下面&#xff0c;不同网段之间的通信&#xff0c;或者是从局域网去往互联网的通信&#xff0c;那么这个过程又是怎么样的呢&#xff1f; 还记得第二篇这个内容吗&#xff0c;访问者把数据交给网关&#xff0c;当…

Gpt4.0最新保姆级教程开通升级

如何使用 WildCard 服务注册 Claude3 随着 Claude3 的震撼发布&#xff0c;最强 AI 模型的桂冠已不再由 GPT-4 独揽。Claude3 推出了三个备受瞩目的模型&#xff1a;Claude 3 Haiku、Claude 3 Sonnet 以及 Claude 3 Opus&#xff0c;每个模型都展现了卓越的性能与特色。其中&a…

Python毕业设计选题:基于django+vue的网上购物系统的设计与实现

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 商品类型管理 商品信息管理 系统管理 订单管理…

uniapp组件实现省市区三级联动选择

1.导入插件 先将uni-data-picker组件导入我们的HBuilder项目中&#xff0c;在DCloud插件市场搜索uni-data-picker 点击下载插件并导入到我们的项目中 2.组件调用 curLocation &#xff1a;获取到的当前位置&#xff08;省市区&#xff09; <uni-data-picker v-slot:defa…

关于Flutter空安全升级方案整理

前言 Flutter 从 2.0 版本开始支持空安全&#xff08;Null Safety&#xff09;。dart 版本为&#xff1a; environment:sdk: ">2.12.0 < 3.0.0"升级到空安全后&#xff0c;由于语法的变动&#xff0c;基本上整个工程&#xff0c;代码都爆红&#xff0c;这对项…

免费送源码:Java+ssm+MySQL ssm家电售后服务 计算机毕业设计原创定制

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对家电售后服务等问题&#xff0c;对家电售后…

共享汽车管理新纪元:SpringBoot框架应用

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

yaml文件编写

Kubernetes 支持YAML和JSON格式管理资源 JSON 格式:主要用于 api 接口之间消息的传递 YAML 格式;用于配置和管理,YAML是一种简洁的非标记性语言,内容格式人性化容易读懂 一&#xff0c;yaml语法格式 1.1 基本语法规则 使用空格进行缩进&#xff08;不使用制表符&#xff0…

ssm071北京集联软件科技有限公司信息管理系统+jsp(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;北京集联软件科技有限公司信息管理系统 \ 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本信息…

满足大众需求的理想选择:1000平米气膜羽毛球馆—轻空间

随着全民健身热潮的兴起和羽毛球运动的广泛普及&#xff0c;越来越多的企事业单位、学校以及社区开始寻求适合的大型羽毛球场地。对于大众需求者而言&#xff0c;如何在有限的预算和时间内建设一个高效且灵活的羽毛球馆&#xff1f;1000平米气膜羽毛球馆正是应运而生的理想解决…

原生鸿蒙应用市场:赋能开发者全生命周期服务体验

文章目录 背景自动化检测前移&#xff1a;早发现&#xff0c;早解决技术细节&#xff1a;静态代码分析与兼容性测试应用场景 按需加载&#xff1a;优化性能&#xff0c;提升用户体验技术细节&#xff1a;模块化与懒加载实现应用场景 应用加密&#xff1a;保护应用代码安全&…