Flutter中Isar数据库对象更新异常:put方法插入新对象而非更新
解决Isar数据库put操作总是插入新对象的问题
核心原因
Isar的put方法是根据对象的主键判断执行更新还是插入:如果对象有有效的主键值(非默认的0或null),就会更新对应主键的记录;如果主键无效,则会插入新对象。你的问题大概率是查询到的cf对象主键异常,或者实体类主键定义有误。
具体解决步骤
1. 检查实体类的主键定义
确保你的Cf实体类正确定义了主键,示例如下:
import 'package:isar/isar.dart'; @collection class Cf { // 定义自增主键,Isar会自动为新插入的对象分配唯一id @Id() int id = Isar.autoIncrement; // 你的其他字段 DateTime? end; bool? status; // 构造函数(可选,方便手动创建对象) Cf({this.end, this.status}); }
如果主键定义为int? id,Isar同样会自动为新对象赋值,但查询返回的对象必须包含有效的id值才能触发更新。
2. 验证查询对象的主键有效性
在修改cf对象属性前,打印主键值确认是否有效:
final cf = cflist.last; print(cf.id); // 输出应该是大于0的整数,而不是0或null
如果输出是0或null,说明查询到的对象没有主键,put时会被当成新对象插入。
3. 改用明确的更新方法(可选)
如果put方式依然有问题,可以使用Isar提供的update方法,直接通过主键指定要更新的记录:
Future<void> updateinvstatus(bool x) async { final isar = await db; final cflist = await isar.cfs.where().findAll(); final cf = cflist.last; // 确保cf.id不为null if (cf.id != null) { await isar.writeTxn(() async { await isar.cfs.update(cf.id!, { Cf.end: DateTime.now(), Cf.status: x, }); }); } }
4. 确认Isar实例初始化正确
确保你的db实例是正确初始化的单例,避免每次操作创建新的Isar实例导致状态异常。
内容的提问来源于stack exchange,提问作者Abash Paudel
相关产品推荐
相关产品推荐

