Isar数据库中TransactionModel的keyID返回固定值且无法用CRUD的问题求助
Isar自增ID返回-9223372036854775808的问题分析与解决
核心原因
这个值不是什么补码,它是Isar内置的Isar.undefinedId常量(对应int类型最小值),用来标记未被持久化到数据库的对象。你打印出这个值,说明访问的对象要么是刚创建还没保存到库的新实例,要么是没有正确从数据库加载的对象——Isar Inspector能看到数据,是因为库中确实存在这些数据,但你代码里操作的对象和库中的不是同一个实例。
常见错误场景
- 直接打印刚创建的对象:new了
TransactionModel但没调用put()方法存到数据库,此时keyID就是默认的undefined值。 - 查询后错误实例化对象:查询到数据后又手动new对象,而非直接使用查询返回的实例。
- 异步操作未await:调用
put()或查询方法时没加await,导致拿到的是未完成操作的初始对象。
解决步骤
- 保存对象时接收返回值
Isar的put()方法会返回保存后带正确ID的对象,一定要用这个返回值访问keyID:final newTx = TransactionModel(/* 填充其他字段 */); // 必须接收put的返回值,这才是带有效ID的对象 final savedTx = await isar.transactionModels.put(newTx); print(savedTx.keyID); // 这里会输出正确的自增ID - 直接使用查询返回的对象
从数据库查询数据后,直接遍历或使用返回的列表元素,不要重新实例化:final txList = await isar.transactionModels.where().findAll(); for (var tx in txList) { print(tx.keyID); // 每个对象都会输出正确的ID } - 用有效ID执行get/delete操作
调用get()或delete()时,必须传入从保存/查询得到的有效ID,不能用默认的undefined值:// 正确示例:用保存后的对象ID删除 await isar.transactionModels.delete(savedTx.keyID);
额外说明
-9223372036854775808就是Isar用来区分“未入库对象”和“已入库对象”的标记,和补码没有关系。只要确保操作的是已经被Isar持久化过的对象,就能拿到正确的自增ID。
内容的提问来源于stack exchange,提问作者Jonathan Cruz
相关产品推荐
相关产品推荐

