如何解决 MS Hololens2 上的 Unreal UWP 应用程序上的 SQLITE_IOERR_SEEK 问题

问题描述 投票:0回答:1

我有一个关于使用 SQLite 与 Unreal Engine 5.0.3 c++ 来作为通用 Windows 平台 (UWP) 应用程序部署在 Microsoft HoloLens 2 上的问题。

初始情况

我有一个自己编写的库作为模块集成在我的虚幻项目中,它依赖于 SQLite (https://www.sqlite.org/),除了一些业务逻辑之外,它还允许我读取和写入数据SQLite 数据库。在我自己编写的库中,我通过包含 标头来使用 SQLite 功能。为了解决依赖性,我使用 Epic Games, Inc. 的官方 SQLite 插件。 此外,我有大量自己编写的单元测试,以测试我自己编写的库的功能,当我通过本地 Windows 计算机上的虚幻编辑器中的“会话前端”运行测试时,这些测试是成功的。正如预期的那样,数据库可以毫无问题地创建、写入、读取。

问题

该应用程序可以在我的本地计算机上构建和测试,没有任何问题。该应用程序可以针对 Microsoft Hololens 2 进行构建、部署和运行。

但是,当在 Microsoft Hololens 2 上运行应用程序和库并且应用程序只想在我的数据库中创建表时,我收到“磁盘 I/O 错误”,扩展错误代码为 5642:SQLITE_IOERR_SEEK。如果我查看文件目录(项目特定 Appdata 中的 LocalState 目录),我会看到创建的数据库具有 0kb 数据量。

规格

  • 虚幻引擎5.0.3
  • Epic Games, Inc. 的 SQLite 插件
  • Windows SDK 版本 10.0.18362.0
  • C++17
  • Microsoft HoloLens 2:适用于企业的 Windows 全息,具有内部版本 22621.1266 并启用了开发功能
  • 装有 Windows 11 的主机

如果有人能帮助我,我会非常高兴,因为几天来我一直被这个错误困扰。如果更多信息有用,请随时询问!

同时尝试解决或评估问题的方法


+CapabilityList=internetClientServer
+CapabilityList=privateNetworkClientServer
+CapabilityList=internetClient
+CapabilityList=AllJoyn
+CapabilityList=codeGeneration
+DeviceCapabilityList=microphone
+DeviceCapabilityList=webcam
+DeviceCapabilityList=gazeInput
+DeviceCapabilityList=wiFiControl
+DeviceCapabilityList=proximity
+DeviceCapabilityList=location
+DeviceCapabilityList=Bluetooth
+UapCapabilityList=musicLibrary
+UapCapabilityList=picturesLibrary
+UapCapabilityList=videosLibrary
+UapCapabilityList=blockedChatMessages
+UapCapabilityList=chat
+UapCapabilityList=enterpriseAuthentication
+UapCapabilityList=objects3D
+UapCapabilityList=phoneCall
+UapCapabilityList=removableStorage
+UapCapabilityList=sharedUserCertificates
+UapCapabilityList=userAccountInformation
+UapCapabilityList=voipCall
+Uap2CapabilityList=spatialPerception
+UapCapabilityList=appointments
+Uap3CapabilityList=backgroundMediaPlayback
+UapCapabilityList=contacts
+Uap6CapabilityList=graphicsCapture
+IotCapabilityList=lowLevelDevices
+Uap6CapabilityList=offlineMapsManagement
+Uap2CapabilityList=phoneCallHistoryPublic
+Uap3CapabilityList=remoteSystem
+IotCapabilityList=systemManagement
+Uap4CapabilityList=userDataTasks
+Uap3CapabilityList=userNotificationListener
+DeviceCapabilityList=lowLevel
+DeviceCapabilityList=pointOfService
+RescapCapabilityList=developmentModeNetwork

考虑论坛/存储库寻求帮助:

sqlite uwp hololens unreal-engine5
1个回答
0
投票

问题已解决!

该 bug 位于

Read
SQLiteEmbeddedPlatform.cpp
中的
UE SQLiteCore Plugin
函数中,通过在构建
Seek()
时调用
Microsoft HoloLens platform
函数来实现。深入研究
Seek()
FileHandle
实现的
Microsoft HoloLens Platform
函数,错误发生在
FileSeek()
函数中,该函数从位于
SetFilePointerEx()
Windows SDK 10.0.18362.0
调用函数
Windows Kits\10\Include\10.0.18362.0\um\fileapi.h
。由于某种未知的原因,该函数返回 false。
Seek()
对应的
Windows platform
函数不会检查返回值,始终返回 true。

这个问题可以通过使用名为

SQLiteZ
的自定义集成虚幻插件从源代码构建 SQLite 库来解决。 SQLite 库(sqlite3.h、sqlite3.c)的源代码来自 SQLite amalgamation

要在 UE 插件中使用该库,在

SQLiteZ.Build.cs
文件中,必须正确设置适当的预处理器语句以构建 SQLite 库,供
Unreal UWP
Microsoft HoloLense 2
上使用。 有关详细信息,请参阅下面的代码块
SQLiteZ.Build.cs

using UnrealBuildTool;

public class SQLiteZ : ModuleRules
{
    public SQLiteZ(ReadOnlyTargetRules Target)
        : base(Target)
    {
        PublicIncludePaths.AddRange(
            new string[] {
                // ... add public include paths required here ...
            });

        PrivateIncludePaths.AddRange(
            new string[] {
                // ... add other private include paths required here ...
            });

        PublicDependencyModuleNames.AddRange(
            new string[] {
                "Core",
                // ... add other public dependencies that you statically link with here ...
            });

        PrivateDependencyModuleNames.AddRange(
            new string[] {
                "CoreUObject",
                "Engine",
                "Slate",
                "SlateCore",
                // ... add private dependencies that you statically link with here ...
            });

        DynamicallyLoadedModuleNames.AddRange(
            new string[] {
                // ... add any modules that your module loads dynamically here ...
            });

        PrivateDefinitions.Add("SQLITE_API=__declspec(dllexport)");
        PrivateDefinitions.Add("SQLITE_HAVE_ISNAN=1");
        // Enable FTS
        PrivateDefinitions.Add("SQLITE_ENABLE_FTS4");
        PrivateDefinitions.Add("SQLITE_ENABLE_FTS5");

        // Enable Deserialization and RTree Subsystem
        PrivateDefinitions.Add("SQLITE_ENABLE_DESERIALIZE");
        PrivateDefinitions.Add("SQLITE_ENABLE_RTREE");

        // Enable Json extension
        PrivateDefinitions.Add("SQLITE_ENABLE_JSON1");

        if (Target.Platform == UnrealTargetPlatform.HoloLens) {
            PrivateDefinitions.Add("SQLITE_OS_WINRT=1");
        }
        PrivateDefinitions.Add("SQLITE_OS_WIN=1");
        PrivateDefinitions.Add("NDEBUG");
        PrivateDefinitions.Add("SQLITE_THREADSAFE=1");
        PrivateDefinitions.Add("SQLITE_TEMP_STORE=0");
        PrivateDefinitions.Add("SQLITE_ENABLE_RTREE=1");
        PrivateDefinitions.Add("SQLITE_ENABLE_GEOPOLY=1");
        PrivateDefinitions.Add("SQLITE_ENABLE_JSON1=1");
        PrivateDefinitions.Add("SQLITE_ENABLE_STMTVTAB=1");
        PrivateDefinitions.Add("SQLITE_ENABLE_DBPAGE_VTAB=1");
        PrivateDefinitions.Add("SQLITE_ENABLE_DBSTAT_VTAB=1");
        PrivateDefinitions.Add("SQLITE_INTROSPECTION_PRAGMAS=1");
        PrivateDefinitions.Add("SQLITE_ENABLE_COLUMN_METADATA=1");
        PrivateDefinitions.Add("SQLITE_MAX_TRIGGER_DEPTH=100");
        PrivateDefinitions.Add("SQLITE_THREAD_OVERRIDE_LOCK=-1");

        bEnableUndefinedIdentifierWarnings = false; // The embedded SQLite implementation generates a lot of these warnings
        bUseUnity = false; // Ensure the embedded SQLite implementation is always compiled in isolation
    }
}

此处显示了将库集成为插件的目录结构。

.

更多信息请参考:

© www.soinside.com 2019 - 2024. All rights reserved.