.NET MAUI应用GitHub Actions部署后SQLite Error 26问题求助
解决.NET MAUI通过GitHub Actions交付AppCenter后SQLite Error 26问题
问题场景
我的.NET MAUI应用基于面向MSSQL的基础库,使用Linq2DB操作SQLite,SQLite数据库作为嵌入式资源打包。本地编译签名APK并通过AppCenter发布到安卓手机一切正常,但通过GitHub Actions workflow交付到AppCenter的版本却抛出SQLite Error 26: 'file is not a database'致命异常,调试模式无此问题,仅在Logcat中捕获到该错误。同时Logcat中还出现警告:monodroid-assembly: Assembly 'en-GB/Microsoft.Data.Sqlite.resources'未找到。
排查与解决方向
1. 嵌入式资源打包时的文件损坏
GitHub Actions的打包流程可能对SQLite二进制数据库文件做了文本格式转换,导致文件结构损坏。
- 确保项目文件中明确数据库文件的构建属性,避免不必要的转换:
<ItemGroup> <EmbeddedResource Include="YourDbFile.db"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <LogicalName>YourDbFile.db</LogicalName> <ExcludeFromSingleFile>false</ExcludeFromSingleFile> </EmbeddedResource> </ItemGroup> - 在GitHub Actions的
dotnet publish命令中,避免启用可能破坏二进制资源的优化参数,保持发布命令简洁:dotnet publish -c Release -f net7.0-android /p:AndroidSigningKeyStore=yourkeystore.keystore /p:AndroidSigningKeyAlias=youralias /p:AndroidSigningKeyPass=$KEYSTORE_PASS /p:AndroidSigningStorePass=$STORE_PASS
2. 嵌入式资源读取方式错误
代码中读取嵌入式资源时,必须用二进制流方式,不能用文本流读取,否则会破坏数据库文件结构:
using var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("YourNamespace.YourDbFile.db"); using var fileStream = new FileStream(localDbPath, FileMode.Create); stream.CopyTo(fileStream);
绝对不要使用StreamReader这类文本读取工具处理数据库文件。
3. 本地化资源缺失的关联修复
Microsoft.Data.Sqlite.resources未找到的警告,可能暗示CI环境打包时遗漏了本地化资源,间接影响SQLite驱动初始化:
- 在项目文件中指定所需的本地化资源范围,减少不必要的资源打包:
<PropertyGroup> <SatelliteResourceLanguages>en</SatelliteResourceLanguages> </PropertyGroup> - 确保GitHub Actions环境安装的.NET MAUI SDK是完整版本,包含所有必要的本地化组件。
4. 保持本地与CI环境的SDK版本一致
本地和GitHub Actions使用的.NET MAUI SDK版本不一致,可能导致打包逻辑差异。在workflow中指定和本地完全相同的SDK版本:
- name: Setup .NET uses: actions/setup-dotnet@v3 with: dotnet-version: '7.0.400' # 替换为你本地使用的具体版本
内容的提问来源于stack exchange,提问作者Jay Kannan
相关产品推荐
相关产品推荐

