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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 14:05:19