开启SQLiteCore插件后,跟IOS系统自带的sql冲突,导致游戏闪退

UE demo 引入 SQLiteCore,并接入闪验或facebook SDK,启动时会闪退。

重现步骤
我们项目在IOS平台上单独用UE的SQLiteCore插件没有问题,单独用IOS第三方SDK也没有问题(闪验 或 Facebook,这些SDK内部调用了IOS原生的sqlite接口)。但是同时启用UE的SQLiteCore和第三方SDK(闪验 或 Facebook)时就会在运行时崩溃,崩的堆栈在sqlite3Malloc函数里(Thread 10:EXC BAD ACCESS(code=1,address=0x0))。

看UE的SQLITE_VERSION是3.31.1版本,IOS原生的SQLITE_VERSION是3.43.2版本,怀疑是版本差异导致的函数冲突和链接错误。

请问你们是否遇到过类似问题,是否有解决方案?[Image Removed]

另外还有一个问题:用UE5.4.​1版本的引擎,使用引擎的SQLite创建和读写db文件,在Windows平台能正常创建,在IOS平台会创建失败,报错是disk I/O error,请问你们是否有遇到过这个问题,是否有解决方案?

测试代码:​

`.h

#pragma once

include “Kismet/BlueprintFunctionLibrary.h”
include “SQLiteDatabaseConnection.h”
include “FeatureTestBPLibrary.generated.h”

UCLASS()
class UFeatureTestBPLibrary : public UBlueprintFunctionLibrary
{
GENERATED_UCLASS_BODY()

UFUNCTION(BlueprintCallable)
static void CreateSQLDB();

UFUNCTION(BlueprintCallable)
static void OpenSQLDB();

UFUNCTION(BlueprintCallable)
static void CloseSQLDB();

UFUNCTION(BlueprintCallable)
static void TryGetDataFromSQLDB(int32 ID);

private:
static FSQLiteDatabaseConnection DC_AudioData;

static FString AudioDataPath;
};

.cpp

include “FeatureTestBPLibrary.h”
include “FeatureTest.h”

FSQLiteDatabaseConnection UFeatureTestBPLibrary::DC_AudioData;
FString UFeatureTestBPLibrary::AudioDataPath;

UFeatureTestBPLibrary::UFeatureTestBPLibrary(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
AudioDataPath = IFileManager::Get().ConvertToAbsolutePathForExternalAppForWrite(*FPaths::Combine(FPaths::ProjectPersistentDownloadDir(), TEXT(“TableData”), TEXT(“DB”), TEXT(“AudioData.db”)));
}

void UFeatureTestBPLibrary::CreateSQLDB()
{
if (FPaths::FileExists(AudioDataPath))
{
FPlatformFileManager::Get().GetPlatformFile().DeleteFile(*AudioDataPath);
}

IFileManager::Get().MakeDirectory(*FPaths::GetPath(AudioDataPath), true);

//Create db file
FString CreateTableSQL = R"(
CREATE TABLE IF NOT EXISTS AudioConfig (
AudioID INTEGER,
AudioName TEXT,
AudioEvent TEXT
);
)";

if (!DC_AudioData.Open(*AudioDataPath, nullptr, nullptr))
{
UE_LOG(LogTemp, Warning, TEXT(“UFeatureTestBPLibrary::CreateSQLDB:----Failed to open DB file %s, error = %s”), *AudioDataPath, *DC_AudioData.GetLastError());
}
else
{
UE_LOG(LogTemp, Warning, TEXT(“UFeatureTestBPLibrary::CreateSQLDB:----Open DB file %s”), *AudioDataPath);
}

if (DC_AudioData.Execute(*CreateTableSQL))
{
UE_LOG(LogTemp, Warning, TEXT(“UFeatureTestBPLibrary::CreateSQLDB:---- successed to execute create sql cmd”));

FString InsertSQL = FString::Printf(TEXT(“INSERT INTO AudioConfig (AudioID, AudioName, AudioEvent) VALUES (1008611, ‘audio1’, ‘event1’);”));
DC_AudioData.Execute(*InsertSQL);

InsertSQL = FString::Printf(TEXT(“INSERT INTO AudioConfig (AudioID, AudioName, AudioEvent) VALUES (1008622, ‘audio2’, ‘event2’);”));
DC_AudioData.Execute(*InsertSQL);

InsertSQL = FString::Printf(TEXT(“INSERT INTO AudioConfig (AudioID, AudioName, AudioEvent) VALUES (1008633, ‘audio3’, ‘event3’);”));
DC_AudioData.Execute(*InsertSQL);
}
else
{
UE_LOG(LogTemp, Warning, TEXT(“UFeatureTestBPLibrary::CreateSQLDB:---- failed to execute create sql cmd, error = %s”), *DC_AudioData.GetLastError());
}

CloseSQLDB();
}

void UFeatureTestBPLibrary::OpenSQLDB()
{
TRACE_CPUPROFILER_EVENT_SCOPE(OpenSQLDB);
if (!FPaths::FileExists(AudioDataPath))
{
UE_LOG(LogTemp, Warning, TEXT(“UFeatureTestBPLibrary::OpenSQLDB:----DB file is not exist %s”), *AudioDataPath);
return;
}

CloseSQLDB();

if (!DC_AudioData.Open(*AudioDataPath, nullptr, nullptr))
{
UE_LOG(LogTemp, Warning, TEXT(“UFeatureTestBPLibrary::OpenSQLDB:----Failed to open DB file %s”), *AudioDataPath);
}
else
{
UE_LOG(LogTemp, Warning, TEXT(“UFeatureTestBPLibrary::OpenSQLDB:----Open DB file %s”), *AudioDataPath);
}
}

void UFeatureTestBPLibrary::CloseSQLDB()
{
DC_AudioData.Close();
}

void UFeatureTestBPLibrary::TryGetDataFromSQLDB(int32 ID)
{
OpenSQLDB();
FDataBaseRecordSet* ResultSet = nullptr;
FString cmd = FString::Printf(TEXT(“select * from AudioConfig WHERE AudioID = %d”), ID);
if (DC_AudioData.Execute(*cmd, ResultSet))
{
if (ResultSet == nullptr || ResultSet->GetRecordCount() == 0)
{
UE_LOG(LogTemp, Warning, TEXT(“UFeatureTestBPLibrary::TryGetDataFromSQLDB, Failed to find id %d in db file”), ID);
return;
}

FDataBaseRecordSet::TIterator itor(ResultSet);
while (itor) {
int32 AudioID = itor->GetInt(TEXT(“AudioID”));
FString AudioName = itor->GetString(TEXT(“AudioName”));
FString audioPath = itor->GetString(TEXT(“AudioEvent”));

UE_LOG(LogTemp, Warning, TEXT(“UFeatureTestBPLibrary::TryGetDataFromSQLDB, select id = %d, result: AudioID = %d, AudioName = %s, AudioPath = %s”),
ID, AudioID, *AudioName, *audioPath);
++itor;
}

delete ResultSet;
ResultSet = nullptr;
}
CloseSQLDB();
}`​

执行上面的​CreateSQLDB()接口后,在IOS平台只能生成一个0KB的空文件

[Image Removed]

请回复一下,谢谢

请回复一下,谢谢

不好意思回复晚了

我试了一下确实5.4确实有创建后大小为0的问题。

我试着将5.6的SQLiteCore文件夹的修改 cherrypick 到5.4,问题不再发生

具体的P4提交为:34827207 35104331 39082747 39084871 39109352 39110200 39115481

主要就是更新sqlite到3.47.1了