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,一经查实,立即删除!

相关文章

关于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…

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

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

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

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

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

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

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

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

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

栈在表达式求值中的应用 导读一、表达式的形式二、波兰表达式与逆波兰表达式三、表达式之间的相互转换四、栈实现波兰表达式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.什么是元对象?2.元对象系统组成3.信号与槽信号和槽的本质绑定信号与槽自定义槽定义槽函数必须遵循一下规则槽函数的类型自定义槽案例 自定义信号自定义信号需要遵循以下规则信号和槽重载二义性问题 4.内存管理1. 简…

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

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

了解游戏相关知识

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

MySQL常见故障案例与优化介绍

前言 MySQL故障排查的意义在于及时识别并解决数据库系统中的问题,确保数据的完整性和可靠性;而性能优化则旨在提高数据库系统的效率和响应速度,从而提升用户体验和系统整体性能。这两方面的工作都对于保证数据库系统稳定运行、提升业务效率和…

加域报错:找不到网络路径

在尝试将计算机加入Windows域时,如果收到“找不到网络路径”的错误提示,可能的原因及解决方法如下: 网络连接问题:确保计算机与域控制器之间的物理网络连接是正常的,可以通过ping命令测试与域控制器的连通性。例如&…

LeetCode 56. 合并区间

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1: 输入:intervals [[1,3…

HarmonyOS 应用开发之LifecycleService接口切换LifecycleData接口切换

LifecycleService接口切换 FA模型接口Stage模型接口对应d.ts文件Stage模型对应接口onStart?(): void;ohos.app.ability.ServiceExtensionAbility.d.tsonCreate(want: Want): void;onCommand?(want: Want, startId: number): void;ohos.app.ability.ServiceExtensionAbility.…

c# 插值搜索-迭代与递归(Interpolation Search)

给定一个由 n 个均匀分布值 arr[] 组成的排序数组,编写一个函数来搜索数组中的特定元素 x。 线性搜索需要 O(n) 时间找到元素,跳转搜索需要 O(? n) 时间,二分搜索需要 O(log n) 时间。 插值搜索是对实例二分搜索的改进,…

前端 - 基础 表单标签 - 表单元素 input - (name Value checked maxlength )属性详解

目录 name 属性 Value 属性 Checked 属性 Maxlength 属性 场景问答 # <input> 标签 除了 type 属性外&#xff0c;还有其他常用属性 >>> name 属性 在上一节 我们遇到的 单选按钮 &#xff0c;为什么 本应该 多选一 结果成了 多选多的问题 就…

# 达梦数据库知识点

达梦数据库知识点 测试数据 -- SYSDBA.TABLE_CLASS_TEST definitionCREATE TABLE SYSDBA.TABLE_CLASS_TEST (ID VARCHAR(100) NOT NULL,NAME VARCHAR(100) NULL,CODE VARCHAR(100) NULL,TITLE VARCHAR(100) NULL,CREATETIME TIMESTAMP NULL,COLUMN1 VARCHAR(100) NULL,COLUMN…

利用甘特图实现精细化项目管控

在项目管理中,通过精细化管控,项目经理能够有效规划、监督和协调各项任务,从而最大限度控制风险,优化资源配置,并确保按时、按质、按量完成项目目标。而在众多项目管理工具中,甘特图无疑是实现精细化项目管控的利器。zz-plan 是一个非常好用的在线甘特图制作工具&#xff0c;一…

Day78:服务攻防-数据库安全RedisCouchDBH2database未授权访问CVE漏洞

目录 前置知识 数据库应用-Redis-未授权访问&CVE漏洞 未授权访问&#xff1a;CNVD-2015-07557 未授权访问-CNVD-2019-21763 未授权访问-沙箱绕过RCE-CVE-2022-0543 数据库应用-Couchdb-未授权越权&CVE漏洞 Couchdb 垂直权限绕过&#xff08;CVE-2017-12635&…

【操作系统】想要更好的学习计算机,操作系统的知识必不可少!!!

操作系统的概念 导言一、日常生活中的操作系统二、计算机系统层次结构三、操作系统的定义3.1 控制和管理计算机资源3.2 组织、调度计算机的工作与资源的分配3.3 给用户和其他软件提供方便接口与环境3.4 总结 四、操作系统的目标和功能4.1 作为管理者4.1.1 处理机管理4.1.2 存储…