刪除結構中的空白空間
一旦我從結構中取消了一些數據,如何刪除我隨後創建的空單元格?對不起這個愚蠢的問題,但我只是新人:)
您將在下面看到“功能 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 模式來啟用刪除。
如果每年、每月、每天有多個條目,則結構會涉及更多 - 就像數據規則指向規範化數據庫的正確方法(具有不同模式)一樣。
希望能幫助到你。