solidity使用mapping+struct复杂数据结构

2020年8月21日18:04:14BCOS评论849阅读模式
摘要

solidity中使用mapping+struct的复杂数据结构时,遇到的问题,Mappings cannot be assigned to。

出错的代码

代码

constructor() public{
  dataBases[TypeConvertUtil.stringToBytes32(TABLE_BAG_NAME)] = bagRecordOf;
  dataBases[TypeConvertUtil.stringToBytes32(TABLE_LOCATIONS_NAME)] = locationRecordOf;
  dataBases[TypeConvertUtil.stringToBytes32(TABLE_ATTENDLOCATION_NAME)] = attendLocationRecordOf;
}

这样写会出现以下报错:

browser/TableDefTools.sol:112:9: TypeError: Mappings cannot be assigned to.
dataBases[TypeConvertUtil.stringToBytes32(TABLE_BAG_NAME)] = bagRecordOf;
^----------------------------------------------------------------------^

正确的代码

定义结构:

struct RecordBean {
	// 表名称
	string tableName;
	// 主键值
	string primaryKey;
	// 内容值
	string[] values;
}
mapping(bytes32 => mapping(bytes32 => RecordBean)) dataBases;

赋值:

dataBases[TypeConvertUtil.stringToBytes32(_tableName)][TypeConvertUtil.stringToBytes32(_primaryKey)] = recordBean;

取值:

RecordBean recordBean = dataBases[TypeConvertUtil.stringToBytes32(_tableName)][TypeConvertUtil.stringToBytes32(_primaryKey)];

备注:

mapping 引用方式为 [ ]

struct      引用方式为   .

 

此外,mapping中对应的struct,以及struct中的某一值,都可以直接修改,实例如下。

pragma solidity ^0.4.24;

contract View {

    struct Info {
        uint256 X;
        uint256 Y;
    }
	mapping(address => Info) public InfoMap;
	

    /**
     * TEST 赋值/存储
     */
     function store(uint256 x, uint256 y) returns (uint){
        Info memory info = Info(x, y);
        InfoMap[msg.sender] = Info;
        return 1;
     }

    /**
     * TEST 更新
     */
     function update(uint256 z) returns (uint){
        InfoMap[msg.sender].X = z;
        return 1;
     }
}

 

BCOS最后更新:2021-3-29