SqfEntity 2.3.0+5的save()方法无法更新数据求助
sqfentity save()方法无法更新数据的问题排查
你遇到的问题是sqfentity 2.3.0+5中save()方法首次插入数据后,再次调用无法更新totalLevel字段,可能的原因及解决方法如下:
可能的原因
- 主键匹配异常:后续调用save()时传入的
id值与首次插入的id不一致,或类型不匹配(比如首次是int,后续变成String),导致sqfentity认为是新记录执行插入而非更新。 - 字段配置为不可更新:ClubData实体定义中,totalLevel字段被标记为
notUpdatable: true,save()时会跳过该字段的更新操作。 - 缓存干扰:sqfentity的缓存机制导致你查询到的是旧数据,误以为字段未更新。
解决方法
验证主键一致性
打印每次调用save()时的data[i]['id']值,确保与首次插入的id完全相同,且类型一致(比如统一为int或String类型)。检查实体字段配置
查看ClubData的实体模型定义(通常是sqfentity生成的代码或你自定义的model文件),确认totalLevel字段未设置notUpdatable: true。如果有该配置,移除即可。改用查询后更新的方式
避免每次新建ClubData实例,改为先查询已有记录再修改保存,确保sqfentity正确识别更新操作:// 根据id查询已有记录 var existingClub = await ClubData().getById(data[i]['id']); if (existingClub != null) { // 更新totalLevel字段 existingClub.totalLevel = data[i]['players'].length; // 如需更新其他字段,可在此处一并修改 await existingClub.save(); } else { // 记录不存在时执行插入 await ClubData( id: data[i]['id'], isUnlocked: 0, currentLevel: 1, totalLevel: data[i]['players'].length, logoURL: data[i]['logoURL'], points: 0, name: data[i]['name'] ).save(); }清理缓存验证结果
如果更新后查询不到最新数据,调用以下代码清理sqfentity缓存后再查询:await ClubData().clearCache();
内容的提问来源于stack exchange,提问作者Melik BOZKURT
相关产品推荐
相关产品推荐

