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了