IndexedDBのデータを更新するコードと実行結果

IndexedDBのデータを更新するコードと実行結果を紹介します。

概要

IndexedDBのデータを更新する場合は、オブジェクトストアのputメソッドを呼び出してデータを更新します。

書式

(IDBObjectStore).put([更新するオブジェクト]);

実装例

コード

以下のHTMLファイルを作成します。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title></title>
  <script type="text/javascript">
    var dbname = "myDB";
    var storename = "myStore";

    var db;

    function OpenMyDatabase() {

      const request = indexedDB.open(dbname, 1);

      request.onupgradeneeded = function (event) {
        const db = event.target.result;
        if (!db.objectStoreNames.contains(storename)) {
          db.createObjectStore(storename, { keyPath: "id" });
          alert('オブジェクトストアを作成しました。');
        }
      };

      request.onsuccess = function (event) {
        db = event.target.result;
        alert('データベースをオープンしました。');
      }

      request.onerror = function (event) {
        console.error("データベースのオープンに失敗しました:", event.target.error);
      };
    }

    function InsertData() {
      // トランザクションとオブジェクトストアの取得
      const transaction = db.transaction(storename, "readwrite");
      const store = transaction.objectStore(storename);

      // データの追加
      store.add({ id: 1, name: "リラックスチェア", price: 45800 });
      store.add({ id: 2, name: "おおきなダイニングテーブル", price: 1648000 });
      store.add({ id: 3, name: "おしゃれなスタンド", price: 28500 });
      store.add({ id: 4, name: "ふかふかソファー", price: 87200 });
      store.add({ id: 5, name: "小さなコーヒーテーブル", price: 16500 });
      store.add({ id: 6, name: "ハードなベッド", price: 122500 });

      transaction.oncomplete = function () {
        console.log("データベースにレコードを挿入しました。");
      };
    }

    function UpdateData() {
      // トランザクションとオブジェクトストアの取得
      const transaction = db.transaction(storename, "readwrite");
      const store = transaction.objectStore(storename);

      // 更新するデータの取得
      const getRequest = store.get(3); // ここではIDが3のレコードを更新

      getRequest.onsuccess = function (event) {
        const data = event.target.result;
        if (data) {
          data.name = "北欧デザインのスタンド";
          const updateRequest = store.put(data);

          updateRequest.onsuccess = function () {
            alert("データを更新しました。");
            console.log("データを更新しました。");
          };
          updateRequest.onerror = function (event) {
            console.error("データの更新に失敗しました:", event.target.error);
          };

        }
      }
      getRequest.onerror = function (event) {
        console.error("データの取得に失敗しました:", event.target.error);
      };
    }

    function SelectAllData() {
      const transaction = db.transaction(storename, "readonly");
      const store = transaction.objectStore(storename);
      const getAllRequest = store.getAll();

      getAllRequest.onsuccess = function () {
        if (getAllRequest.result) {
          for (i = 0; i < getAllRequest.result.length; i++) {
            console.log("レコード取得成功:", getAllRequest.result[i]);

            var elem = document.getElementById("output");
            elem.innerHTML += getAllRequest.result[i].id + ", " + getAllRequest.result[i].name + ", " + getAllRequest.result[i].price + "<br/>";
          }
        } else {
          console.log("指定された ID のレコードが見つかりませんでした。");
        }
      };
    }
  </script>
</head>
<body>
  <h2>Indexed DB InsertData テストページ</h2>
  <a href="javascript:OpenMyDatabase();">OpenDatabase</a><br>
  <a href="javascript:InsertData();">InsertData</a><br>
  <a href="javascript:UpdateData();">UpdateData</a><br>
  <a href="javascript:SelectAllData();">SelectAllData</a><br>
  <hr>
  <div id="output"></div>

</body>
</html>

解説

  • データベースを開く部分についてはこちらの記事を参照してください
  • レコードを挿入する部分についてはこちらの記事を参照してください
  • レコードの一覧を表示する部分についてはこちらの記事を参照してください


レコードの更新部分は以下のコードになります。

    function UpdateData() {
      // トランザクションとオブジェクトストアの取得
      const transaction = db.transaction(storename, "readwrite");
      const store = transaction.objectStore(storename);

      // 更新するデータの取得
      const getRequest = store.get(3); // ここではIDが3のレコードを更新

      getRequest.onsuccess = function (event) {
        const data = event.target.result;
        if (data) {
          data.name = "北欧デザインのスタンド";
          const updateRequest = store.put(data);

          updateRequest.onsuccess = function () {
            alert("データを更新しました。");
            console.log("データを更新しました。");
          };
          updateRequest.onerror = function (event) {
            console.error("データの更新に失敗しました:", event.target.error);
          };

        }
      }
      getRequest.onerror = function (event) {
        console.error("データの取得に失敗しました:", event.target.error);
      };
    }

はじめに、トランザクションオブジェクトとオブジェクトストアを取得します。

      const transaction = db.transaction(storename, "readwrite");
      const store = transaction.objectStore(storename);


次に更新するレコードのオブジェクトを取得します。今回はid=3のオブジェクトを取得します。

      const getRequest = store.get(3);


レコードが取得できたらレコードを更新します。
onsuccessイベント内で以下のコードを実行します。取得したオブジェクトの値を書き換え、 store.put()メソッドを呼び出してデータを更新します。

  const data = event.target.result;
  if (data) {
    data.name = "北欧デザインのスタンド";
    const updateRequest = store.put(data);

    updateRequest.onsuccess = function () {
      alert("データを更新しました。");
      console.log("データを更新しました。");
    };
    updateRequest.onerror = function (event) {
      console.error("データの更新に失敗しました:", event.target.error);
    };
  }

実行結果

上記のHTMLファイルをWebブラウザで表示します。下図のページが表示されます。
IndexedDBのデータを更新するコードと実行結果:画像1

[OpenDatabase]のリンクをクリックします。データベースをオープンした旨のダイアログが表示されます。
IndexedDBのデータを更新するコードと実行結果:画像2

[InsertData]リンクをクリックします。データがデータベースに挿入されます。
IndexedDBのデータを更新するコードと実行結果:画像3

[SelectAllData]のリンクをクリックします。
IndexedDBのデータを更新するコードと実行結果:画像4

挿入されたレコードが表示されます。
IndexedDBのデータを更新するコードと実行結果:画像5

ページを再表示します。[OpenDatabase]のリンクをクリックします。
IndexedDBのデータを更新するコードと実行結果:画像6

データベースをオープンした旨のダイアログが表示されます。
IndexedDBのデータを更新するコードと実行結果:画像7

[UpdateData]のリンクをクリックします。
IndexedDBのデータを更新するコードと実行結果:画像8

データを更新した旨のアラートダイアログが表示されます。
IndexedDBのデータを更新するコードと実行結果:画像9

[SelectAllData]のリンクをクリックします。
レコードが表示されます。id=3の項目が「おしゃれなスタンド」から「北欧デザインのスタンド」に変更されていることが確認できます。
IndexedDBのデータを更新するコードと実行結果:画像10

データベースのデータの変更ができました。

AuthorPortraitAlt
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
作成日: 2025-02-08
Copyright © 1995–2025 iPentec all rights reserverd.