在开发 EOS 合约过程中,有时候我们需要遍历一个 multi_index 表来删除 (erase) 一些不用的数据,通常情况下,我们会下面这样实现
unbox _tbl(_self,_self.value); for( auto it = _tbl.begin(); it != _tbl.end(); it++) { _tbl.erase(it); }
但这样是会报错的,错误信息如下
Exception Details: 3160005 table_operation_not_permitted: The table operation is not allowed dereference of deleted object
究其原因,是因为删除动作发生时,迭代器就立刻失效了
正确的解决方案是
unbox _tbl(_self,_self.value); auto ite = _tbl.begin(); while( ite != _tbl.end()) { ite = _tbl.erase(ite); }
删除动作成功后, erase()
方法会返回下一个迭代数据
如果要根据条件来删除,不符合条件的则过滤,那么可以使用下面这种方法
unbox _tbl(_self,_self.value); auto ite = _tbl.begin(); while( ite != _tbl.end()) { if (ite->status == 0 && ite->created_at < fivedays_ago) { ite = _tbl.erase(ite); } else { ite++; } }
目前尚无回复