从Xamarin迁移至.NET Maui时因SQL-Cipher问题无法创建数据库连接
.NET MAUI(.NET7.0)迁移SQLCipher加密数据库连接失败排查与解决
原Xamarin环境下的可用代码
在Xamarin项目中,可通过以下代码创建SQLCipher加密的数据库连接:
var options = new SQLiteConnectionString(dbPath, true, dbPassword, postKeyAction: c => { c.Execute("PRAGMA cipher_compatability = 3"); }); SQLiteConnection connection = new SQLiteConnection(options);
迁移到.NET MAUI后的错误信息
将上述代码迁移到.NET7.0的.NET MAUI项目后,无法正常运行,抛出以下异常:
SQLite.SQLiteException: file is not a database Result:
SQLite.SQLite3+Result.NonDBFile
使用的NuGet包版本
- Xamarin项目:
sqlite-net-sqlcipher版本1.8.116 - .NET MAUI项目:
sqlite-net-pcl版本1.8.116
问题原因与解决方案
核心原因
.NET MAUI项目中使用的sqlite-net-pcl包不包含SQLCipher加密支持,而Xamarin项目依赖的sqlite-net-sqlcipher是专门集成了SQLCipher的版本,二者底层实现不同,导致无法正确解密原加密数据库文件。
具体解决步骤
替换NuGet包
卸载MAUI项目中的sqlite-net-pcl,安装sqlite-net-sqlcipher包(建议使用与Xamarin项目一致的1.8.116版本,或适配.NET7的最新兼容版本)。修正PRAGMA语句拼写(可选)
代码中cipher_compatability存在拼写错误,正确的SQLCipher语法应为cipher_compatibility,虽然旧版本可能兼容错误拼写,但修正后能避免潜在问题:c.Execute("PRAGMA cipher_compatibility = 3");确保MAUI中数据库路径正确
MAUI的文件系统访问逻辑与Xamarin略有差异,需使用MAUI提供的FileSystem类获取正确的应用数据路径,示例:string dbPath = Path.Combine(FileSystem.AppDataDirectory, "your_database.db");
内容的提问来源于stack exchange,提问作者iTag
相关产品推荐
相关产品推荐

