移除ToMany关联后保存Objectbox对象出现Error 404问题求助
Objectbox关联操作404错误的原因及解决方法
错误本质
你遇到的Error 404是Objectbox的实体未找到错误,核心原因是:ToMany集合的移除操作是延迟生效的——你从MyObject的关联集合里删掉InsideObject后,Objectbox并没有立即同步数据库里的关联关系,只是在内存里标记了变更。当你先删除InsideObject再保存MyObject时,Objectbox在处理MyObject的关联更新时,会尝试验证关联实体的存在性,发现对应的InsideObject已经被删除,就抛出了404错误。
可行解决方案
1. 手动提交关联变更再删除实体
在删除InsideObject之前,先调用ToMany的applyChanges()方法,强制同步关联关系到数据库,这样后续保存MyObject时就不会残留失效的实体引用:
// 从关联集合移除目标对象 myObject.insideObjects.remove(targetInsideObj); // 立即提交关联关系变更 myObject.insideObjects.applyChanges(); // 删除InsideObject boxInsideObject.remove(targetInsideObj.id); // 最后保存MyObject boxMyObject.put(myObject);
2. 用事务包裹全流程
把移除关联、删除实体、保存主对象放在同一个写事务里,利用事务的原子性让Objectbox正确处理关联生命周期,避免中间状态的冲突:
store.runInTransaction(TxMode.write, () { myObject.insideObjects.remove(targetInsideObj); boxInsideObject.remove(targetInsideObj.id); boxMyObject.put(myObject); });
3. 刷新关联集合缓存
如果上述方法无效,可以在保存MyObject前强制刷新关联集合的状态,清除内存中残留的失效引用:
myObject.insideObjects.remove(targetInsideObj); boxInsideObject.remove(targetInsideObj.id); // 重置关联集合,从数据库重新加载最新状态 myObject.insideObjects.reset(); // 保存MyObject boxMyObject.put(myObject);
验证小技巧
保存MyObject前可以打印myObject.insideObjects.targetIds(这是ToMany内部维护的关联实体ID列表),如果这里还能看到已删除的InsideObject的ID,就说明是延迟变更导致的问题,用applyChanges()就能解决。
内容的提问来源于stack exchange,提问作者Xababa Dalabama
相关产品推荐
相关产品推荐

