Xamarin.Forms中新建SQLite表非空:含一条空记录原因咨询
我之前开发Xamarin.Forms应用时也碰到过一模一样的问题,结合你的代码和场景,大概率是下面这些原因导致的,咱们一个个来理清楚:
最常见的原因:旧数据库文件残留
SQLite的CreateTable<PurchasesList>()方法是幂等的——意思是如果目标表已经存在,它只会做表结构的增量更新(比如新增列),不会清空原有数据,更不会删除旧表。这条id=1的记录,很可能是你之前某次测试(可能自己都没留意到)时插入的,之后哪怕你修改了代码重新运行,设备/emulator上的旧数据库文件还在,里面的记录自然也保留了下来。
容易忽略的点:隐藏的插入操作
仔细检查你的初始化代码或者其他关联逻辑,有没有无意间调用了类似database.Insert(new PurchasesList())的语句?如果创建PurchasesList实例时没有给Title赋值,插入后就会生成一条Id自增为1、Title为null的记录——有时候可能是调试时加的测试代码,后来忘了删掉。
表结构更新的遗留问题
如果之前你修改过PurchasesList的实体类(比如一开始没加AutoIncrement特性,后来才加上),CreateTable只会更新表结构,不会重置表内的数据,之前的测试记录也会被保留。
解决办法
1. 开发阶段删除旧数据库(最直接)
不同平台的数据库位置不一样:
- Android:打开设备文件管理器,找到
/data/data/[你的应用包名]/files/目录下的数据库文件删除;或者用adb命令删除。 - iOS:在Xcode的「Devices and Simulators」里找到你的应用,点击「Download Container」,解压后在Documents目录里找到数据库文件删除,再重新运行应用。
- UWP:在应用的本地存储文件夹中找到数据库文件删除。
2. 开发期强制重置表(谨慎用!)
如果是测试阶段,可以先删除旧表再创建新表,确保数据干净:
// 只在开发测试时用,生产环境绝对不能这么写! database.DropTable<PurchasesList>(); database.CreateTable<PurchasesList>();
3. 排查代码中的插入逻辑
全局搜索Insert、InsertOrReplace这类SQLite操作方法,确认有没有意外触发的插入行为——比如在ViewModel的构造函数里、页面初始化时不小心加了插入代码。
另外,你的实体类里私有字段title没有初始化,虽然这不会导致自动插入记录,但可以给它设个默认值(比如private string title = string.Empty;),这样新创建的实例Title默认是空字符串而非null,更符合大多数业务场景的需求。
内容的提问来源于stack exchange,提问作者Remin Maxim

