Xamarin.Android发布模式下SQLite创建表报错的解决咨询
解决Xamarin Android发布模式下SQLite创建表失败的问题
嘿,这个问题我太熟了——调试模式一切正常,一到发布模式就报错,核心原因就是**Android发布模式默认开启的代码混淆(ProGuard/R8)**在搞事情!
为什么会出现这个错误?
SQLite-net是靠反射来识别你的模型类的public属性,进而创建数据库表的。但发布模式下的混淆工具会优化代码:它会把类、属性的名称重命名成毫无意义的短名称,甚至会移除它觉得“没被用到”的属性。这样SQLite-net反射的时候就找不到TicketType的属性了,自然就抛出Cannot create a table without columns的错误。
怎么解决?这里有几个靠谱的方案:
方案1:给模型类加[Preserve]特性(最推荐)
直接在你的模型类上加上[Preserve]特性,告诉混淆工具“别动这个类和它的所有成员”。修改你的TicketType代码:
using SQLite; using System; using Xamarin.Forms; // 记得引用这个命名空间,不然找不到Preserve特性 namespace SolarmonAndroidApp.Models.TicketPageModels { [Preserve(AllMembers = true)] // 保留类的所有属性和方法 public class TicketType { [PrimaryKey, AutoIncrement] public int Id { get; set; } public int _Id { get; set; } public string Name { get; set; } public bool IsActive { get; set; } public bool IsFixed { get; set; } } }
别忘了给你代码里用到的其他模型类(比如TicketAction、Park、Section这些)也都加上这个特性哦!
方案2:配置ProGuard规则批量排除类
如果你不想逐个给模型加特性,可以修改Android项目的混淆配置文件(一般是proguard-rules.pro或者proguard.cfg),添加以下规则:
# 保留SQLite-net的核心类,别让混淆工具动它们 -keep class SQLite.** { *; } -keep class SQLite-net.** { *; } # 保留你所有的模型类所在的命名空间 -keep class SolarmonAndroidApp.Models.** { *; }
这样混淆工具就会跳过这些类,SQLite-net就能正常反射到属性了。
方案3:临时关闭混淆(不推荐正式发布用)
如果只是临时测试,你可以直接关掉发布模式的混淆:
- 右键你的Android项目 → 属性 → Android选项 → 发布标签页 → 取消勾选“启用代码收缩和混淆”
⚠️ 注意:关闭混淆会让APK体积变大,而且代码没有混淆保护,正式发布时千万别这么做!
验证一下
改完之后重新生成发布版APK,装到手机上试试,应该就能正常创建SQLite表,不会再报错啦!
内容的提问来源于stack exchange,提问作者Viventum
相关产品推荐
相关产品推荐

