Solidity CRUD 尝试调用所有数据 return 而不是使用 ID 一个一个地调用

Solidity CRUD trying to call All data return instead of one by one using ID

我创建了一个 solidity 来记录数据 CRUD,就像我可以在其中创建读取更新删除一样,但我想创建一个 readAll 函数,想知道我该如何写入 solidity,因为我像下面这样写它不起作用。对于使用 id 调用它 return 正确但不是 readAll。期待您的帮助 <3

例子

function readAllTask() public view returns (uint, uint256, uint256) {
        return (tasks.id, tasks.stackAddress, tasks.nftId);  <============= return everything
    }
pragma solidity ^0.8.6;

contract RecordData {
    
    struct Task {
        uint id;
        uint256 stackAddress;
        uint256 nftId;
    }
    
    Task[] tasks;
    uint nextId; // default value 0, add public to see the value
    
    function createTask(uint256 _stackAddress, uint256  _nftId) public {
        tasks.push(Task(nextId, _stackAddress, _nftId));
        nextId++;
    }

    
    function findIndex(uint _id) internal view returns (uint) {
        for (uint i = 0; i < tasks.length; i++) {
            if (tasks[i].id == _id) {                
                return i;
            }
        }
        revert("Task not found");
    }
    
    function updateTask(uint _id, uint256 _stackAddress, uint256 _nftId) public {
        uint index =  findIndex(_id);
        tasks[index].stackAddress = _stackAddress;
        tasks[index].nftId = _nftId;
    }
    
    function readTask(uint _id) public view returns (uint, uint256, uint256) {
        uint index = findIndex(_id);
        return (tasks[index].id, tasks[index].stackAddress, tasks[index].nftId);
    }
    
    function deleteTask(uint _id) public {
        uint index = findIndex(_id);
        delete tasks[index];
    }
    
}

我认为你有这样做的理由,但提醒一下,将数据保存到区块链中并不是一件好事,因为成本很高。


如果你想return所有的任务,那么只需进行taskspublic。 Solidity自动为其分配一个get函数。

如果你想获取任务结构的一些具体内容,那么考虑这样的事情:

function readAllTask() public view returns (uint, uint256, uint256 [] memory) {
        // something
    }

您可以 return 结构数组:

function readAllTask() public view returns (Task[] memory) {
    return tasks;
}