Unity 2021.3.13带SQLite功能的独立程序跨PC读取数据库失败
Unity SQLite独立版跨PC运行异常排查方案
针对你遇到的Unity 2021.3.13 SQLite程序在非开发PC Windows独立版输出null的问题,结合已排查的点,给出以下具体解决方向:
1. 数据库路径逻辑修正
多数情况下问题出在路径读取的兼容性上:
- 确保数据库文件在Unity中设置为Copy to Output Directory:右键数据库文件→导入设置,将
Copy to设为Copy if newer或Always Copy - 改用
Application.persistentDataPath作为数据库存储路径,而非相对路径。首次运行时从StreamingAssets复制数据库到该目录(避免权限或路径解析问题),示例代码:using System.IO; using UnityEngine; using UnityEngine.Networking; public class DBLoader : MonoBehaviour { private string dbName = "your_db_name.db"; void Start() { string targetPath = Path.Combine(Application.persistentDataPath, dbName); if (!File.Exists(targetPath)) { #if UNITY_EDITOR || UNITY_STANDALONE_WIN string sourcePath = Path.Combine(Application.streamingAssetsPath, dbName); File.Copy(sourcePath, targetPath); #elif UNITY_ANDROID using (UnityWebRequest www = UnityWebRequest.Get(Path.Combine(Application.streamingAssetsPath, dbName))) { www.SendWebRequest(); while (!www.isDone) { } if (www.result == UnityWebRequest.Result.Success) { File.WriteAllBytes(targetPath, www.downloadHandler.data); } } #endif } // 后续使用targetPath作为数据库路径 } } - 可在代码中输出
targetPath的实际路径(比如通过Debug.Log或UI文本),到目标PC上检查该路径下是否存在数据库文件
2. 补充SQLite原生依赖库
Unity的SQLite功能依赖Windows平台的sqlite3.dll,该文件常被遗漏:
- 从Unity安装目录的
Editor/Data/MonoBleedingEdge/lib/mono/unityjit-win64(64位程序)或unityjit-win32(32位)下复制sqlite3.dll - 将dll放入项目的
Plugins/Windows目录,右键dll→导入设置,设置平台为Windows,勾选对应架构(x64或x86),取消其他平台勾选 - 打包后确认输出目录的
Plugins文件夹中包含该dll
3. 替换兼容版System.Data与I18N DLL
手动添加的DLL可能和Unity内置Mono环境不兼容:
- 删除项目中现有手动添加的
System.Data.dll、I18N.dll等文件 - 从Unity安装目录的
Editor/Data/MonoBleedingEdge/lib/mono/4.7.2-api下复制对应DLL到项目Plugins目录 - 同样设置这些DLL的导入平台为Windows,匹配目标架构,避免跨平台冲突
4. 检查SQL连接与查询逻辑
确认连接字符串和查询语句无错误:
- 使用标准SQLite连接字符串:
string connStr = $"Data Source={targetPath};Version=3;"; using (var conn = new System.Data.SQLite.SQLiteConnection(connStr)) { conn.Open(); string countQuery = "SELECT COUNT(*) FROM your_table_name;"; using (var cmd = new System.Data.SQLite.SQLiteCommand(countQuery, conn)) { var result = cmd.ExecuteScalar(); if (result != null) { int itemCount = Convert.ToInt32(result); // 更新UI显示数量 } } } - 确保表名、字段名拼写正确,避免因大小写或语法错误导致查询返回null
5. 排除安全软件拦截
部分PC的杀毒软件或防火墙可能阻止程序读取本地文件:
- 暂时关闭目标PC的安全软件,测试程序是否正常运行
- 若恢复正常,将程序.exe文件和所在文件夹添加到安全软件的信任列表
内容的提问来源于stack exchange,提问作者Dimitrios Konstantinidis
相关产品推荐
相关产品推荐

