IDBCursor: update() 方法

Baseline 已廣泛支援

此特性已相當成熟,可在許多裝置和瀏覽器版本上使用。自 ⁨2015 年 7 月⁩以來,各瀏覽器均已提供此特性。

注意:此功能在 Web Workers 中可用。

update() 方法是 IDBCursor 介面的一部分,它會返回一個 IDBRequest 物件,並在一個單獨的執行緒中更新物件儲存中游標當前位置的值。如果游標指向一個剛剛被刪除的記錄,那麼會建立一個新記錄。

請注意,你不能對從 IDBIndex.openKeyCursor() 獲取的游標呼叫 update() (或 IDBCursor.delete())。對於這些需求,你應該改用 IDBIndex.openCursor()

語法

js
update(value)

引數

value

要儲存在當前位置的新值。

返回值

一個 IDBRequest 物件,後續與此操作相關的事件會在此物件上觸發。

如果操作成功,請求的 result 屬性的值將是已更新記錄的鍵。

異常

此方法可能會丟擲以下型別之一的DOMException

TransactionInactiveError DOMException

如果此 IDBCursor 的事務不活躍,則丟擲此錯誤。

ReadOnlyError DOMException

如果事務模式是隻讀,則丟擲此錯誤。

InvalidStateError DOMException

如果游標是使用 IDBindex.openKeyCursor 建立的,當前正在迭代,或者已經迭代到末尾之後,則丟擲此錯誤。

DataError DOMException

如果底層物件儲存使用內聯鍵,並且物件儲存鍵路徑中值中的屬性與游標當前位置的鍵不匹配,則丟擲此錯誤。

DataCloneError DOMException

如果正在儲存的資料無法透過內部結構化克隆演算法進行克隆,則會丟擲此異常。

示例

在這個簡單的程式碼片段中,我們建立了一個事務,檢索了一個物件儲存,然後使用游標迭代物件儲存中的所有記錄。如果當前游標的 albumTitle 是“A farewell to kings”,我們將使用 const request = cursor.update(); 更新專輯發行的年份。

請注意,你不能使用 cursor.update() 來更改主鍵,因此我們沒有更改專輯標題;這會破壞資料的完整性。在這種情況下,你必須先刪除該記錄,然後使用 IDBObjectStore.add 新增一個新記錄。另請注意,你不能直接將 cursor.value 傳遞給 update 呼叫,因此下面的示例使用了一箇中間變數 updateData

游標不需要我們根據鍵來選擇資料;我們可以直接獲取所有資料。另請注意,在迴圈的每次迭代中,你可以使用 cursor.value.foo 從游標物件下的當前記錄中獲取資料。有關完整的可工作示例,請參閱我們的 IDBCursor 示例線上檢視示例)。

js
function updateResult() {
  list.textContent = "";
  const transaction = db.transaction(["rushAlbumList"], "readwrite");
  const objectStore = transaction.objectStore("rushAlbumList");

  objectStore.openCursor().onsuccess = (event) => {
    const cursor = event.target.result;
    if (cursor) {
      if (cursor.value.albumTitle === "A farewell to kings") {
        const updateData = cursor.value;

        updateData.year = 2050;
        const request = cursor.update(updateData);
        request.onsuccess = () => {
          console.log("A better album year?");
        };
      }

      const listItem = document.createElement("li");
      listItem.textContent = `${cursor.value.albumTitle}, ${cursor.value.year}`;
      list.appendChild(listItem);
      cursor.continue();
    } else {
      console.log("Entries displayed.");
    }
  };
}

規範

規範
Indexed Database API 3.0
# ref-for-dom-idbcursor-update①

瀏覽器相容性

另見