You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:32:09