UE5 SQLite笔记

开发环境:

系统:Windows 10 64 bit
引擎:Unreal Engine 5.1.1
IDE:JetBrains Rider 2023.2.1
语言:C++
工具:DB Browser for SQLite

 SQLite数据类型:

    //INTEGER	TEXT	BLOB	REAL	NUMERIC/*integer 				--->整数,可以是1、2、3、4、6或8个字节,SQLite会根据数值大小自动调整。real 					--->实数(浮点数),一律使用8个字节存储text 					--->文本,最大支持长度为1,000,000,000个字符的单个字符串blob 					--->二进制对象,最大支持长度为1,000,000,000个字节null 					--->没有值char(size)  			--->固定长度的字符串,size规定字符串的长度varchar(size) 			--->可变长度的字符串,size规定字符串的最大字符个数*/

启用插件:

添加插件模块引用:"SQLiteCore","SQLiteSupport"

// Copyright Epic Games, Inc. All Rights Reserved.using UnrealBuildTool;public class PakFramework : ModuleRules
{public PakFramework(ReadOnlyTargetRules Target) : base(Target){PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "UMG","SQLiteCore","SQLiteSupport"});// Uncomment if you are using Slate UI//PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore", "InputDevice"});// Uncomment if you are using online features// PrivateDependencyModuleNames.Add("OnlineSubsystem");// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true}
}

示例代码:

【ASQLiteManager.h】

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "SQLiteDatabaseConnection.h"
#include "SQLiteManager.generated.h"UCLASS()
class PAKFRAMEWORK_API ASQLiteManager : public AActor
{GENERATED_BODY()public:// Sets default values for this actor's propertiesASQLiteManager();protected:// Called when the game starts or when spawnedvirtual void BeginPlay() override;public:// Called every framevirtual void Tick(float DeltaTime) override;virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;private:FSQLiteDatabaseConnection DBConnection;bool bIsOpened = false;
public:bool OpenDB(const FString& FileFullPath,const FString& UserName = TEXT(""),const FString& Password = TEXT(""));bool CloseDB();bool ExecSql(const TCHAR* InStatement);bool ExecSql(const TCHAR* InStatement, FDataBaseRecordSet*& RecordSet);
}

【ASQLiteManager.cpp】

// Fill out your copyright notice in the Description page of Project Settings.#include "SQLiteManager.h"#include "MyFramework/AOT/Runtime/CoreKits/LogKit.h"// Sets default values
ASQLiteManager::ASQLiteManager()
{// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.PrimaryActorTick.bCanEverTick = true;
}// Called when the game starts or when spawned
void ASQLiteManager::BeginPlay()
{Super::BeginPlay();const FString DBFileFullPath = TEXT("D:/_DB/DB_G005.db");if(OpenDB(DBFileFullPath)){/*//【1.创建数据表】if(ExecSql(TEXT("create table table_name(id integer,name text,age integer);") )){ULogKit::I(__FUNCTION__,TEXT("成功生成表格!!!"));}else{ULogKit::E(__FUNCTION__,TEXT("生成表格失败!!!"));}*//*//【2.检查数据表是否存在】FDataBaseRecordSet* ResultSet;if(ExecSql(TEXT("select * from sqlite_master where type = 'table' and name = 'table_name';"),ResultSet)){const int32 RecordCount = ResultSet->GetRecordCount();if(RecordCount > 0){ULogKit::I(__FUNCTION__,TEXT("数据表 存在!!!"));}else{ULogKit::E(__FUNCTION__,TEXT("数据表 不存在 1 !!!"));}//【注意】//此处必须删除FDataBaseRecordSet对象,其为new方式生成对象-->[FSQLiteDatabaseConnection.cpp]-->RecordSet = new FSQLiteResultSet(MoveTemp(PreparedStatement));//否则CloseDB()会失败,退出程序时抛出异常:"Destructor called while an SQLite database was still open. Did you forget to call Close?"delete ResultSet;ResultSet = nullptr;}else{ULogKit::E(__FUNCTION__,TEXT("数据表 不存在 2 !!!"));}*//*//【3.插入表字段】if(ExecSql(TEXT("alter table table_name add column age2 integer;"))){ULogKit::I(__FUNCTION__,TEXT("插入表字段 成功!!!"));}else{ULogKit::E(__FUNCTION__,TEXT("插入表字段 失败!!!"));}*//*//【4.删除表】if(ExecSql(TEXT("drop table table_name;"))){ULogKit::I(__FUNCTION__,TEXT("删除表 成功!!!"));}else{ULogKit::E(__FUNCTION__,TEXT("删除表 失败!!!"));}*//*//【5.1.数据-增加行】if(ExecSql(TEXT("insert into table_name values(1,\"张三\",18,19);")))//不指定列字段{ULogKit::I(__FUNCTION__,TEXT("增加行 成功!!!"));}else{ULogKit::E(__FUNCTION__,TEXT("增加行 失败!!!"));}//【5.2.数据-增加行】if(ExecSql(TEXT("insert into table_name(name ,age) values(\"李四\",18);")))//指定列字段{ULogKit::I(__FUNCTION__,TEXT("增加行 成功!!!"));}else{ULogKit::E(__FUNCTION__,TEXT("增加行 失败!!!"));}*//*//【6.数据-删除行】if(ExecSql(TEXT("delete from table_name where id=1;"))){ULogKit::I(__FUNCTION__,TEXT("删除行 成功!!!"));//若删除不存在项,也会返回true}else{ULogKit::E(__FUNCTION__,TEXT("删除行 失败!!!"));}*//*//【7.数据-更新行】if(ExecSql(TEXT("update table_name set name=\"王五\",age=38 where id=1;"))){ULogKit::I(__FUNCTION__,TEXT("更新行 成功!!!"));//删除不存在项,也会返回true}else{ULogKit::E(__FUNCTION__,TEXT("更新行 失败!!!"));}*///【8.数据-查询】FDataBaseRecordSet* ResultSet;if(DBConnection.Execute(TEXT("select * from tablename"),ResultSet)){FDataBaseRecordSet::TIterator itor(ResultSet);//通过get获得数据while (itor) {int32 Id = itor->GetInt(TEXT("id"));FString Name = itor->GetString(TEXT("name"));int32 Age = itor->GetInt(TEXT("age"));ULogKit::I(__FUNCTION__,TEXT("id = ")+FString::FromInt(Id)+TEXT(" ; name = ")+Name+TEXT(" ; age = ")+FString::FromInt(Age));++itor;}//【注意】//此处必须删除FDataBaseRecordSet对象,其为new方式生成对象-->[FSQLiteDatabaseConnection.cpp]-->RecordSet = new FSQLiteResultSet(MoveTemp(PreparedStatement));//否则CloseDB()会失败,退出程序时抛出异常:"Destructor called while an SQLite database was still open. Did you forget to call Close?"delete ResultSet;ResultSet = nullptr;}}else{ULogKit::E(__FUNCTION__,TEXT("无法打开DB!!!"));}
}// Called every frame
void ASQLiteManager::Tick(float DeltaTime)
{Super::Tick(DeltaTime);
}void ASQLiteManager::EndPlay(const EEndPlayReason::Type EndPlayReason)
{Super::EndPlay(EndPlayReason);CloseDB();
}bool ASQLiteManager::OpenDB(const FString& FileFullPath,const FString& UserName,const FString& Password)
{if(IsDatabaseExists(FileFullPath)){if(DBConnection.Open(*FileFullPath,nullptr,nullptr)){bIsOpened = true;}else{bIsOpened = false;}}else{bIsOpened = false;}return bIsOpened;
}bool ASQLiteManager::CloseDB()
{if(bIsOpened){DBConnection.Close();return true;}else{return false;}
}bool ASQLiteManager::ExecSql(const TCHAR* InStatement)
{if(bIsOpened){return DBConnection.Execute(InStatement);}else{return false;}
}bool ASQLiteManager::ExecSql(const TCHAR* InStatement, FDataBaseRecordSet*& RecordSet)
{if(bIsOpened){return DBConnection.Execute(InStatement,RecordSet);}else{return false;}
}

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

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

相关文章

Docker 设置redis 集群

安装Docker: 首先确保你的系统上已经安装了Docker和Docker Compose。你可以根据官方文档进行安装:https://docs.docker.com/get-docker/ 编写Docker Compose文件: 创建一个Docker Compose文件(例如docker-compose.yml&#xff09…

关于OpenFeign的返回类型包装问题

在一天夜里。我在使用feign的调用时,突然出现了一点点问题。 就是对于feign类型的包装问题。产生了疑问。 在后来,也就是今天。在网上取取经。看到了一个答案。说:feign的调用会有一个编码器和解码器。 使用feign的解码器。他的原理也很简…

NoSQL之Redis配置

文章目录 NoSQL之Redis配置一、关系数据库和非关系数据库1、关系型数据库2、非关系型数据库3、非关系型数据库产生背景4、关系型数据库和非关系型数据库的区别4.1 数据存储方式不同4.2 扩展方式不同4.3 对事务性的支持不同 5、总结5.1 关系型数据库5.2 非关系型数据库 二、Redi…

Linux中关于文件管理方面常用命令行介绍

Linux操作系统以其高效的文件管理系统而著称,它提供了丰富的命令行工具来管理文件和目录。这些命令行工具使得用户可以轻松地创建、复制、移动、删除和查找文件,以及修改文件的权限和所有权。下面将介绍一些Linux中关于文件管理方面常用的命令行工具。 …

Linux中关于驱动方面常用命令行介绍

Linux中关于驱动方面的常用命令行涵盖了多个方面,包括驱动加载与卸载、设备查看与管理、驱动信息查询以及驱动开发等。以下是一些常用的命令行工具及其功能介绍: 驱动加载与卸载: insmod:加载指定内核模块(驱动&#x…

基于springboot实现房屋租赁管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现房屋租赁系统演示 摘要 房屋是人类生活栖息的重要场所,随着城市中的流动人口的增多,人们对房屋租赁需求越来越高,为满足用户查询房屋、预约看房、房屋租赁的需求,特开发了本基于Spring Boot的房屋租赁系统。 …

鸿蒙实战开发-如何使用三方库

使用三方库 在使用三方库之前,需要安装 ohpm,并在环境变量中配置。 在项目目录的Terminal窗口执行ohpm命令下载依赖 ohpm install yunkss/eftool 命令运行成功后,在项目的oh-package.json5文件中会自动添加上依赖,如下所示&am…

【Node.js从基础到高级运用】十九、Node.js 捕获错误之“未捕获的异常”

引言 在 Node.js 应用程序中,错误处理是保证应用稳定性和可靠性的关键部分。特别是“未捕获的异常”(uncaught exceptions),如果不妥善处理,很可能会导致整个进程崩溃。在本文中,我们将探讨如何在 Node.js …

NFS环境搭建与在K8s的应用

第一部分&#xff1a;配置 docker 1.1、配置Nginx&#xff0c;转发 nexus 上传包的请求 sudo tee /etc/nginx/conf.d/k8s.conf <<-‘EOF’ HTTPS 服务器块 server { listen 443 ssl; server_name sls.registry.k8s; # SSL 证书配置 ssl_certificate /home/projectnam…

JimuReport积木报表 v1.7.4 正式版本发布,免费的JAVA报表工具

项目介绍 一款免费的数据可视化报表&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完成报…

【GenAI】使用GenAI堆栈构建视频分析和转录字幕聊天机器人

【GenAI】使用GenAI堆栈构建视频分析和转录字幕聊天机器人 目录 【GenAI】使用GenAI堆栈构建视频分析和转录字幕聊天机器人高层架构入门指南克隆存储库指定您的API密钥构建和运行应用程序使用yt-whisper提交视频访问Dockerbot聊天服务结论推荐超级课程: Docker快速入门到精通K…

【数字后仿】isolation Cell基础

1、在芯片验证中,“isolation” 和 “复位值(reset value)” 是两个可能相关联但不同的概念。解释一下这两个术语: Isolation(隔离):在多电源域(power domain)的芯片设计中,当其中一个电源域关闭时(比如为了节能),隔离机制确保关闭的电源域不会影响到其他仍在工作…

Qt加载.css/.qss文件设置控件的QSS样式(支持程序运行时修改且立即生效类似换肤效果)

初学Qt时&#xff0c;你是如何设置QWidget&#xff0c;QPushButton等原生基础控件的样式的&#xff1f;是不是主要是两种方法&#xff1f; 1.直接在可视化的.ui文件中直接添加qss语句。 2.在代码中通过setStyleSheet(QString qss)来设置qss语句。 上述两种方法&#xff0c;在程…

【数据结构】你知道波兰表达式和逆波兰表达式吗?我才知道原来栈在表达式求值中还能这样使用……

栈在表达式求值中的应用 导读一、表达式的形式二、波兰表达式与逆波兰表达式三、表达式之间的相互转换四、栈实现波兰表达式4.1 问题分析4.2 问题完善4.3 算法实现4.3.1 获取波兰表达式4.3.2 从右往左扫描表达式4.3.3 遇到操作数进行入栈操作4.3.4 遇到操作符进行对应操作4.3.5…

Qt元对象系统

第二章Qt元对象系统 文章目录 第二章Qt元对象系统1.什么是元对象&#xff1f;2.元对象系统组成3.信号与槽信号和槽的本质绑定信号与槽自定义槽定义槽函数必须遵循一下规则槽函数的类型自定义槽案例 自定义信号自定义信号需要遵循以下规则信号和槽重载二义性问题 4.内存管理1. 简…

【数据库索引】【面试题】【SQL】什么时候不需要用索引?

在数据库查询优化中,索引是一种重要的工具,可以提高查询性能。然而,并不是所有的情况下都适合使用索引。 以下是一些情况下(收集整理)不建议使用索引: 更新频繁的列:索引会占用数据库资源,当列经常被更新时,索引可能会变得过时,导致查询性能下降。 小数值类型:对于…

原生小程序开发性能优化指南

性能优化指南 1.骨架屏 业务可以在数据加载完成之前用骨架屏幕来占位&#xff0c;提升体验。 2.包大小优化 减小包中静态资源&#xff0c;例如图片文件&#xff0c;可将图片进行压缩降低文件体积。无用文件、函数、样式剔除。除了部分用于容错的图片必须放在代码包&#xf…

跨平台移动端开发技术对比

跨平台移动端开发技术对比 移动互联网时代,开发一款App通常需要覆盖iOS和Android两大平台。为了提高开发效率、控制成本,很多团队会选择跨平台开发的技术方案。目前主流的跨平台开发技术包括React Native、Flutter、Weex、uni-app等。本文将对比分析几种主流跨平台技术的优劣。…

了解游戏相关知识

个人笔记&#xff08;整理不易&#xff0c;有帮助点个赞&#xff09; 笔记目录&#xff1a;学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-CSDN博客 个人随笔&#xff1a;工作总结随笔_8、以前工作中都接触过哪些类型的测试文档-CSDN博客 目录 一&#xff1a…

【嵌入式DIY实例】-DIY便携式粉尘分析仪

DIY便携式粉尘分析仪 文章目录 DIY便携式粉尘分析仪1、硬件准备2、硬件接线3、代码实现细粉尘分析仪是一种用于监测废气通过管道、烟囱或烟道时悬浮在废气中的粉尘或细颗粒浓度的装置; 通常,来自工业燃烧过程或空气过滤系统的废气。 悬浮在大气中一段时间的固体颗粒构成尘埃。…