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

Isar数据库中TransactionModel的keyID返回固定值且无法用CRUD的问题求助

Isar自增ID返回-9223372036854775808的问题分析与解决

核心原因

这个值不是什么补码,它是Isar内置的Isar.undefinedId常量(对应int类型最小值),用来标记未被持久化到数据库的对象。你打印出这个值,说明访问的对象要么是刚创建还没保存到库的新实例,要么是没有正确从数据库加载的对象——Isar Inspector能看到数据,是因为库中确实存在这些数据,但你代码里操作的对象和库中的不是同一个实例。

常见错误场景

  • 直接打印刚创建的对象:new了TransactionModel但没调用put()方法存到数据库,此时keyID就是默认的undefined值。
  • 查询后错误实例化对象:查询到数据后又手动new对象,而非直接使用查询返回的实例。
  • 异步操作未await:调用put()或查询方法时没加await,导致拿到的是未完成操作的初始对象。

解决步骤

  1. 保存对象时接收返回值
    Isar的put()方法会返回保存后带正确ID的对象,一定要用这个返回值访问keyID:
    final newTx = TransactionModel(/* 填充其他字段 */);
    // 必须接收put的返回值,这才是带有效ID的对象
    final savedTx = await isar.transactionModels.put(newTx);
    print(savedTx.keyID); // 这里会输出正确的自增ID
    
  2. 直接使用查询返回的对象
    从数据库查询数据后,直接遍历或使用返回的列表元素,不要重新实例化:
    final txList = await isar.transactionModels.where().findAll();
    for (var tx in txList) {
      print(tx.keyID); // 每个对象都会输出正确的ID
    }
    
  3. 用有效ID执行get/delete操作
    调用get()或delete()时,必须传入从保存/查询得到的有效ID,不能用默认的undefined值:
    // 正确示例:用保存后的对象ID删除
    await isar.transactionModels.delete(savedTx.keyID);
    

额外说明

-9223372036854775808就是Isar用来区分“未入库对象”和“已入库对象”的标记,和补码没有关系。只要确保操作的是已经被Isar持久化过的对象,就能拿到正确的自增ID。

内容的提问来源于stack exchange,提问作者Jonathan Cruz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 16:56:11