Struct

刪除結構中的空白空間

  • December 15, 2019

一旦我從結構中取消了一些數據,如何刪除我隨後創建的空單元格?對不起這個愚蠢的問題,但我只是新人:)

您將在下面看到“功能 removeAppointment”,其中給定一年,它會取消包含該年份的所有約會。然後,我在結構中保留要刪除的空格。

pragma solidity ^0.5.14;

contract Calendario_Appuntamenti {

   mapping (uint => calendar) public appointment;
   address owner;
   uint256 public _counter = 0;


   constructor ()public{
       owner = msg.sender;
   }

   modifier only0wner(){
       require (msg.sender == owner);
       _;
   }

   struct calendar{

       uint256 _id;
       uint256 _day;
       string _month;
       uint256 _year;
   }

   function addAppointment (uint256 _day, string memory _month, uint256 _year) public{
       _counter +=1;
       appointment [_counter] = calendar (_counter,_day,_month,_year); 
   }

   function removeAppointment (uint256 _yeartoremove) public only0wner {
       uint256 _i;
        _i = _counter;

       while (_i > 0){

           if(_yeartoremove == appointment [_i]._year){

               delete (appointment [_i]);
           }
           _i -=1;

       }
   }
}

更具體地說:您的結構中沒有“空”空格,但在您的映射中:您從映射中刪除了一個條目。

通常,映射沒有空格:一旦從中刪除條目,該條目就像任何未初始化的條目一樣:它根本不存在。在您的情況下,您(ab)通過將映射結構用作有序列表來稍微使用它,因此您可以擁有“空”條目。

你基本上有幾個選擇:

1)重新分配所有後續映射條目以具有較低的id。如果您有很多條目,則相當昂貴

2)更改您的資料結構以使用數組而不是映射。這樣你也不需要_counter變數。刪除時,您可以移動後續元素 - 如果您有很多元素,這也很昂貴。

3)最好的選擇:使用更複雜的結構。此處的範例(尤其是最後一個可能對您有用):Solidity 是否有解決良好且簡單的儲存模式?

簡短而直接的答案是

delete myMapping[index];

這將在填充結構曾經所在的位置創建一個初始化的慢速。

這個想法引起了我對“失踪”的擔憂。您的循環意味著期望 ID 將是連續的。

另一個問題是完全使用循環,因為它不會擴展。這是個壞消息。 https://blog.b9lab.com/getting-loopy-with-solidity-1d51794622ad

對應用程序的了解還不夠精確,但其想法是組織數據,這樣您就不必進行迭代。

例如,如果每一年、每一月、每一天只有一個條目,那麼關鍵欄位可以是這些值的散列。然後,您可以使用 CRUD 模式來啟用刪除。

如果每年、每月、每天有多個條目,則結構會涉及更多 - 就像數據規則指向規範化數據庫的正確方法(具有不同模式)一樣。

希望能幫助到你。

引用自:https://ethereum.stackexchange.com/questions/78236