UE4中使用Sqlite数据库操作步骤

[UE虚幻引擎插件介绍] DTSQLite 插件说明 :蓝图操作SQLite3文件,执行SQL语句。 本插件可以在UE里面使用蓝图操作SQLite3文件,并且执行SQL语句,CREATE,SELECT,DELETE,INSERT,UPDATE。直接操作数据库,并返回相应结果集,并可以把结果集转换为TArray或是Json数据。wp:heading。 阅读详情
AI摘要

本文介绍如何在项目中集成SQLite数据库,包括下载、编译及配置步骤,并提供了在Unreal Engine中使用SQLite的具体示例代码。

首先下载sqlite需要的文件,去Sqlite官方下载源码https://www.sqlite.org/download.html,总共下载两个文件,一个是Source Code下面的sqlite-amalgamation-3300100,以及Precompiled Binaries for Windows下面的sqlite-dll-win64-x64-3300100。

解压sqlite-dll-win64-x64-3300100文件,运行VS2017中Visual Studio命令提示程序,进入到解压后的文件夹中,运行命令:lib /def :sqlite3.def  /machine:X64 (编译lib文件X需要大写)。即可生成lib文件。

       

创建两个文件夹Includes和Libs,把sqlite-amalgamation-3300100解压的所有.c和.h代码放到Includes文件夹中,把生成的sqlite3.lib文件放到Libs的文件下。将Includes和Libs文件夹放到一个新建的sqlite文件夹下。

然后将sqlite库放到项目文件夹下,则可以将sqlite文件夹放到ProjectName.build.cs同目录下,然后在ProjectName.build.cs添加数据库路径,然后编译引擎即可。

示例:注意C++类继承自UBlueprintFunctionLibrary,定义的函数声明为static,这样你就可以在蓝图的任意一个类中调用这些函数(全局函数)。

#pragma once

#include "Engine.h"
#include <string>
#include "Kismet/BlueprintFunctionLibrary.h"
#include "SqliteDataBase.generated.h"

/**
  * Sqlite数据库查询相关操作,在其他类中声明本类之后即可调用本类函数
 *本例中数据库(name,password,type)
 */
UCLASS()
class CLASSNAME_API USqliteDataBase : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()
public:
	USqliteDataBase();
	~USqliteDataBase();

	//得到数据库存放路径
	UFUNCTION(BlueprintCallable, Category = "SqliteDatabase")
		static FString GetDataBasePath();

	//打开数据库
	UFUNCTION(BlueprintCallable, Category = "SqliteDatabase")
		static bool OpenDataBase(FString strDataBasePath);

	//对数据库进行元素插入
	UFUNCTION(BlueprintCallable, Category = "SqliteDatabase")
		static bool InsertItem(FString strUserName, FString strPassword, FString strType);

	//删除元素
	UFUNCTION(BlueprintCallable, Category = "SqliteDatabase")
		static bool DeleteItem(FString strUserName);

	//按照名称查询
	UFUNCTION(BlueprintCallable, Category = "SqliteDatabase")
		static bool QueryItem(FString strUserName);

	//查找数据的类别
	UFUNCTION(BlueprintCallable, Category = "SqliteDatabase")
		static int32 QueryType(FString strUserName, FString strPassword, FString& strType);
};
#include "SqliteDataBase.h"
#include "sqlite3.h"

using namespace std;
sqlite3 *pDataBase = nullptr;

//查询结果存入该数组
TArray<FString> Results;
//存放查询临时字符
FString strResults;

USqliteDataBase::USqliteDataBase() {
	//
}

USqliteDataBase::~USqliteDataBase() {
	//
}

FString USqliteDataBase::GetDataBasePath() {
	FString strGameContentPath = *FPaths::ProjectContentDir();
	strGameContentPath += "DataBase";
	FString strPath = FPaths::Combine(*strGameContentPath, L"DataBaseName.db");
	return strPath;
}

bool USqliteDataBase::OpenDataBase(FString strDataBasePath) {
	string strDBPath(TCHAR_TO_UTF8(*strDataBasePath));
	int nRes = sqlite3_open(strDBPath.c_str(), &pDataBase);
	if (nRes != SQLITE_OK)
	{
		UE_LOG(LogTemp, Warning, TEXT("OPEN DATABASE FAILED!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"));
		return false;
	}
	else
	{
		UE_LOG(LogTemp, Warning, TEXT("OPEN DATABASE SUCC!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"));
		return true;
	}
}

bool USqliteDataBase::InsertItem(FString strUserName, FString strPassword, FString strType) {
	FString strSql = "";
	strSql += "insert into DataTableName(username, password,type)";
	strSql += "values('";
	strSql += strUserName;
	strSql += "','";
	strSql += strPassword;
	strSql += "','";
	strSql += strType;
	strSql += "');";
	char* cErrMessage;
	string strSqlRes(TCHAR_TO_UTF8(*strSql));
	int nRes = sqlite3_exec(pDataBase, strSqlRes.c_str(), 0, 0, &cErrMessage);
	if (nRes != SQLITE_OK)
	{
		string str(cErrMessage);
		UE_LOG(LogTemp, Warning, TEXT("INSERT FAILED!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"));
		return false;
	}
	else
	{
		UE_LOG(LogTemp, Warning, TEXT("INSERT SUCC!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"));
		return true;
	}
}

bool USqliteDataBase::DeleteItem(FString strUserName) {
	FString strSql = "";
	strSql += "delete from DataTableName where username ='";
	strSql += strUserName;
	strSql += "';";
	char* cErrMessage;
	string strSqlRes(TCHAR_TO_UTF8(*strSql));
	int nRes = sqlite3_exec(pDataBase, strSqlRes.c_str(), 0, 0, &cErrMessage);
	if (nRes != SQLITE_OK)
	{
		UE_LOG(LogTemp, Warning, TEXT("DELETE FAILED!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"));
		return false;
	}
	else
	{
		UE_LOG(LogTemp, Warning, TEXT("DELETE SUCC!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"));
		return true;
	}
}

/**
*查询回调函数,每次查到一条结果信息,即调用一次本函数
*NotUserd:该参数不清楚
*column_n:指的是查询结果有多少列
*column_Value:指的是某一列的值
*column_Name:指的是某一列的名称。例如username,password,type等
*/
static int QueryResult(void *NotUserd, int column_n, char** column_Value, char** column_Name) {
	for (int i = 0; i < column_n; i++) {
		strResults = "";
		strResults += column_Name[i];
		strResults += ":";
		strResults += column_Value[i];
		strResults += "\n";
		Results.Add(strResults);
		GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, strResults);
	}
	return 0;
}

bool USqliteDataBase::QueryItem(FString strUserName) {
	FString strSql = "";
	strSql += "select * from DataTableName where username ='";
	strSql += strUserName;
	strSql += "';";
	char* cErrMessage;
	string strSqlRes(TCHAR_TO_UTF8(*strSql));
	int Res = sqlite3_exec(pDataBase, strSqlRes.c_str(), QueryResult, 0, &cErrMessage);
	if (Res != SQLITE_OK) {
		return false;
	}
	return true;
}

int32 USqliteDataBase::QueryType(FString strUserName, FString strPassword, FString& strType) {
	sqlite3_stmt * stmt = NULL;
	const char *zTail;
	FString strSql = "select role from DataTableName where username = '";
	strSql += strUserName;
	strSql += "' and password = '";
	strSql += strPassword;
	strSql += "'";
	string strQuerySql(TCHAR_TO_UTF8(*strSql));
	if (sqlite3_prepare_v2(pDataBase, strQuerySql.c_str(), -1, &stmt, &zTail) == SQLITE_OK)
	{
		int iCount = sqlite3_column_count(stmt);
		while (sqlite3_step(stmt) == SQLITE_ROW)
		{
			int Type = sqlite3_column_int(stmt, 0);
			strType = FString::FromInt(Type);
		}
	}
	sqlite3_finalize(stmt);
	return 0;
}

在蓝图中调用:

UE4 含源码插件合集 插件合集 阅读详情

相关推荐

基于MCP协议的虚幻引擎API精准查询工具:告别AI编程幻觉

在AI辅助编程日益普及的今天,大型语言模型(LLM)在代码生成时经常出现API调用错误、头文件路径不准确等“幻觉”问题,严重影响开发效率和代码质量。模型上下文协议(MCP)作为一种标准化接口协议,允许AI助手动态连接外部专业数据源,实现实时、精准的信息查询。通过构建离线SQLite数据库,将特定版本虚幻引擎的完整API文档(包括函数签名、头文件路径、类参考等)进行结构化存储,AI助手可以在毫秒级内获得准确结果。这种技术方案的核心价值在于彻底杜绝了因训练数据过时或偏差导致的API误用,为游戏开发、实时交互应用

weixin_30706691的博客 628

MySQL查看 InnoDB表中每个索引的高度

  我们都知道MySQL里,索引通常用B+树来实现的。B+树的叶子结点才具体保存数据(聚簇索引保存的是行数据;普通索引是主键,如有需要得回表),非叶子结点都是用来索引叶子结点的。假设索引高度为h,那么每次索引查询都要查询h个索引页面才能找到叶子结点的索引数据。所以h的大小,势必成为索引效率的一个关键。那么通常表的索引高度h是多大呢?   我们再假设扇出系数为k,则索引里可索引key的数s=k^h...

weixin_34318326的博客 388

虚幻引擎数据库集成:UE-MySQL/MariaDB插件从配置到实战

这次我们来看一个专门为虚幻引擎(Unreal Engine)开发者准备的数据库连接插件: UE-MySQL 与 MariaDB 集成 v4.1(5.8) 。对于需要在游戏或交互应用中集成数据库功能的开发者来说,这个插件直接打通了虚幻引擎蓝图与MySQL/MariaDB数据库之间的桥梁,让你无需编写复杂的C++网络代码,就能在项目中实现数据的增删改查。 这个插件的核心价值在于,它将数据库操作封装成了直观的蓝图节点,大大降低了数据库集成的门槛。无论是需要存储玩家存档、管理游戏内经济系统、记录排行榜数据,还是构建

weixin_33910385的博客 384

UE5 SQLite笔记

【代码】UE5 SQLite笔记。

㊰ ❀ ☀ ☁ ☂ ☃ 1689

UnrealCLR实战:C#与虚幻引擎5深度集成与调试指南

在游戏开发领域,托管代码与原生引擎的集成是提升开发效率的关键技术。其核心原理是通过桥接层实现运行时环境的互操作,允许开发者使用熟悉的语言和工具链调用底层引擎功能。这一技术价值在于能够结合托管语言的高生产力和原生引擎的高性能,特别适用于需要快速迭代逻辑、复用现有代码库或整合丰富第三方库的项目场景。例如,利用C#的LINQ进行数据查询、依赖注入管理复杂对象生命周期,可以显著提升游戏系统代码的可维护性。本文聚焦于UnrealCLR这一具体解决方案,针对环境配置、双向通信和混合调试三大核心挑战,提供了从工具链精确匹

363

虚幻引擎集成MySQL/MariaDB插件:从环境配置到打包部署的完整实践指南

数据库连接是游戏与应用开发中实现数据持久化的核心技术,它通过特定的通信协议和客户端库,在应用程序与数据库服务器之间建立稳定、高效的数据通道。其原理在于封装底层的网络传输、身份验证和查询协议,使开发者能够使用高级语言(如SQL)进行数据操作。这项技术的核心价值在于,它让结构化数据的存储、查询和同步变得直接而可靠,无需开发者从零实现复杂的网络和存储逻辑。在游戏开发领域,数据持久化是支撑玩家存档、排行榜、配置管理和游戏状态保存的关键基础设施。无论是单机游戏的本地存档,还是联网游戏的服务器端数据存储,稳定高效的数据

weixin_29967445的博客 297

ue4~5 build.cs 链接sqlite(记录一下,备忘)

尝试了众多大神的方法,只有这个编译成功了,记录下来,以备参考

weixin_42318094的博客 518

基于Android的SQLite数据库操作

求赞 基于Android的SQLite数据库操作功能介绍一、创库二、基本操作1.实例化sql对象2.添加数据2.查询数据3.修改数据4.删除数据 功能介绍 本文的增删改查方法都Android自带的SQLiteOpenHelper,虽然直接用sql语句来映射相应的数据库操作比较直观且便于管理,但是学习总是一条漫长的过程。。。。。 相关文章: Android 开发之 Sqlite数据库操作 Android Cursor(光标)解析 android query方法各个参数的含义 一、创库 引入SQLit.

weixin_45880583的博客 3626

UE_sqlite使用

UE_sqlite使用 PS: 参考文档:https://blog.youkuaiyun.com/object__/article/details/102785739 sqlite官方:https://www.sqlite.org/download.html

原在路上的博客。 765

DataAccessUE4:用于保存 UObject 的虚幻引擎的数据访问模块

数据访问 用于保存 UObject 的虚幻引擎的数据访问模块。 旨在与 SQLite 一起使用,但如果接口实现正确,则可以进行修改以支持各种其他数据库。 概述 在使用 Unreal 时,我希望能够将 UObjects 保存到本地数据库 sqlite,但我不想每次创建新对象时都必须编写自定义代码。 看看像实体框架这样的现代 Web 框架,您可以将属性应用于一个类,该类将允许框架访问有关您的对象的元数据并保存它。 Epic 的团队为开发人员构建了一个甜蜜的反射界面,我决定看看是否可以以类似的方式使用它。 后来我发现有一种像 Laravel 一样查询我的数据的方法也很有用,所以我把一些代码放在一起,松散地模仿了那个系统。 我不知道这是否应该在生产代码中使用,所以更多地考虑这是一个概念证明:) 如果满足以下要求,当前状态下的插件可以将 UObject 保存到 sqlite 数据库: 它使用

RH850_U2A系列HSM安全核开启但是固件未烧录导致无法启动也无法再烧入固件废板问题分析解决

hsm核导致的安全锁死补救方案

u011941262的博客 1734

【UE4】UE4内使用Sqlite数据库

写在前面。 系统环境:Win10 X64 引擎版本为:UE4.17.2 编译器版本为: VS2015Pro 因为项目需要数据库对一些数据进行管理和其他的操作,所以花了些时间研究了一下如何在UE4中使用Sqlite数据库。 围观了许多Blog和Answer,要么语焉不详,或者是版本太古老。 另外再吐槽一下官方文档,说是将Sqlite已经集成到引擎里了,一没看到源码,二没找到文档,简直坑。

Carl0v0的博客 6086

瑞芯微RK3576开发实战:固件烧录与内核启动的典型问题解析

本文详细解析了瑞芯微RK3576开发板在固件烧录与内核启动过程中遇到的典型问题及解决方案。从开发工具版本检查、DDR配置调整到内核启动异常的设备树适配和电源管理问题,提供了系统性的调试方法和实用技巧,帮助开发者高效解决RK3576开发中的常见挑战。

weixin_33700350的博客 454

如何使用的Ue4自带的SQLiteSupport

在UE4.6版本加入的模块。可以让开发者使用SQLite数据库。SQlite是个轻量型的本地数据库。 我下面就来介绍一下如何使用这个模块。 第一步:下载SQLite源代码以及SQLite GUI管理工具SQLite Expert。 进入http://www.sqlite.org/,点击 DownLoad,选择源代码下载。 SQLite Expert可以去http://w...

weixin_33932129的博客 780

Skiplist,B,B+tree,LSM tree

SkipList 理解(如何实现): 即使是有序的链表,查找的时间复杂度也是O(n),但链表不能随机访问所以不适用于二分查找,使得查找的时间复杂度为O(logn)。 于是将有序链表和二分查找结合得到了SkipList,类似于二叉搜索树,这是一种以空间换时间的算法,通过在每个节点中增加向前的指针,从而提升查找效率(如下图所示)。 一开始如a所示,是一个有序的链表,时间复杂度O(n)。随后建立了e所示的SkipList,从最顶层往下查找,可以跳过许多元素,减少查找次数。 ​

weixin_45875458的博客 947

Microapp 接入vite子应用

MicroApp接入vite版本,干货满满,手把手步骤说明,加上报错说明,赶紧上车!

outsider76557的博客 4659

UE4 使用Sqlite

配置 启用SqlSupport插件 Build.cs 添加 PublicDependencyModuleNames.AddRange(newstring[]{"Core","CoreUObject","Engine","InputCore","SQLiteSupport"}); 查询例 头文件定义函数 //Path数据库路径,SqlQuery查询语句,Items查询返回结果。FSqliteDataTable UFUNCTION(BlueprintCallable,Category="S..

qq_42003378的博客 1213

Acer宏碁暗影骑士擎AN515-58原厂系统恢复指南:从ISO镜像到完整出厂设置

本文详细介绍了为Acer宏碁暗影骑士擎AN515-58游戏本恢复原厂系统的完整指南。从准备工作、数据备份到下载官方镜像、制作恢复U盘,再到BIOS设置与恢复流程,一步步教你如何将系统完整还原至出厂状态,确保所有硬件驱动、NITROSENSE控制中心等专属优化功能恢复正常,解决系统卡顿、功能异常等问题。

weixin_29271263的博客 1096

UE4 操作 SQLite3

UE4 操作 SQLite3 overview 蓝图操作SQLite3 打开数据链接 查询 Cpp 操作SQLite3 注意:外部模块调用插件内的接口,需要将插件中的接口导出。 class HISQLITE3_API USQLiteConnector { } USQLiteConnector* NewSQLiteConnector = NewObject<USQLiteConnector>(); FSQLiteReturnInfo ReturnInfo; Ne

GIS探索之路 929

ESD放电模式以及电源箝位 (power clamp )电路

由于ESD电压具有很快的上升速度(其ESD脉冲上升时间约在10ns左右),Vrc端的电压因为RC延迟效应无法跟得上VDD端的ESD电压上升速度,Vrc端的为低电位导致反相器工由于ESD电压具有很快的上升速度(其ESD脉冲上升时间约在10ns左右),Vrc端的电压因为RC延迟效应无法跟得上VDD端的ESD电压上升速度,Vrc端的为低电位导致反相器工作将输出端Vout电压上拉到高电位。从而Vg端的高电位触发导通了NMOS元件(Mesd)的晶体管,因而ESD电流便经由Mesd而泄放掉。由于晶体管Mesd的栅极导通

DOG_BITE_DOG的博客 2万+

汇川伺服Modbus-RTU通讯实战:从帧结构解析到西门子PLC配置

本文详细解析了汇川伺服与西门子PLC通过Modbus-RTU协议进行通讯的实战步骤,包括帧结构解析、硬件连接、参数设置及PLC程序配置。通过具体案例和常见问题排查指南,帮助工程师快速掌握工业自动化中的通讯技术,提升设备调试效率。

weixin_33670713的博客 453

UE4-【C++】【UE4接入CISQLite3】

1.下载插件CISQLite3 2.创建UE4工程,添加Plugins目录和CISQLite3,将1下载到的插件放入Plugins/CISQLite3 3.工程添加uplugin .uproject添加 "Plugins": [ { "Name": "CISQLite3", "Enabled": true } ] UE工程目录.Build....

yuxikuo_1的专栏 564

抖音小程序:解决获取手机号报错 getPhoneNumber:fail auth deny,登录注册时需要获取用户手机号,getPhoneNumber一直提示错误(Uniapp抖音小程序报错也能解决)

抖音字节小程序获取手机号报错getPhoneNumber:fail auth deny,抖音 小程序 获取手机号 报错 getPhoneNumber:fail auth ,抖音小程序获取手机号始终返回拒绝,抖音小程序获取手机号,已经过了试运营期但依旧报错如何解决,调用 tt.getPhoneNumber 接口报错,登录注册时需要获取用户手机号,getPhoneNumber一直提示getPhoneNumber:fail auth deny,此能力仅支持小程序通过试运营期后可用,默认获取权限,无需申请;unia

✅ 精选推荐文章 4305

UE使用sqlite3数据库close失败问题

在ue4中调用sqlite3数据库,在执行查询语句时候,返回的database数据指针变量是new出来的变量地址,如果使用结束不进行delete操作的话,除了引起内存泄露外,还会导致close时候,返回值为5,也就是busy状态,造成关闭失败,下次重新链接数据库时候也会失败。 ...

执手画眉弯的博客 724

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

asp.net中配置使用Sqlite轻型数据库

Sqlite 管理工具 SQLiteDeveloper及破解 功能特点 表结构设计,数据维护,ddl生成,加密数据库支持,sqlite2,3支持 唯一缺憾,收费,有试用期 破解方法: 注册表删除 HKEY_CURRENT_USER\SharpPlus\Sqlit...

chutisun0039的博客 167

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

虚幻引擎Pak文件分析工具:原理、实现与实战应用

在游戏开发与软件工程中,资源打包与压缩是优化分发和运行性能的关键技术。其核心原理是将大量零散文件(如贴图、音频、代码)通过特定算法和格式组织成单个归档文件,以减少磁盘占用和加速加载。这项技术的核心价值在于显著降低包体体积、简化部署流程并管理资源依赖。在虚幻引擎等大型游戏开发场景中,.pak文件作为最终资源包,其内部结构复杂,直接分析困难。因此,专用的Pak文件分析工具应运而生,它通过解析二进制格式、可视化资源分布和诊断空间占用,帮助开发者高效进行包体优化、加载错误排查和版本差异对比。本文聚焦于此类工具的设计

diandingyin9417的博客 444

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

上一篇: C++中static的用法
下一篇: UE4中文本文件配置文件Json文件XML文件的读写
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值