IndexedDBの実装と活用

IndexedDBの概要

IndexedDBは、ブラウザが提供するローカルストレージの仕組みであり、大量の構造化されたデータを効率的に保存および検索するために設計されています。この技術は、非同期処理をサポートしており、オブジェクトや配列、バイナリデータまで保存可能で、インデックスを用いて高速なクエリ処理が行えます。

IndexedDBの主な特徴

  • 大容量データの保存:localStorageよりも大規模なデータ(数十MBからGB単位)を保存できます。
  • 非同期処理:UIスレッドをブロックしない非同期処理を採用。
  • オブジェクトベースの保存:JavaScriptオブジェクトを直接保存可能。
  • トランザクション対応:複数の操作を一括して実行し、整合性を保証。
  • インデックスのサポート:特定のフィールドにインデックスを設定することで検索性能を向上。

IndexedDBの基本的な使い方

1. データベースのオープン

indexedDB.open() を使用して、データベースを開くか新規に作成します。


const dbOpenRequest = indexedDB.open('sampleDB', 1);
  

イベントハンドラ

  • onupgradeneeded:データベース作成またはバージョンアップ時に発生。
  • onsuccess:データベースのオープン成功時に発生。
  • onerror:エラー発生時に発生。

コード例


const dbOpenRequest = indexedDB.open('sampleDB', 1);

dbOpenRequest.onupgradeneeded = (e) => {
  const db = e.target.result;
  if (!db.objectStoreNames.contains('userData')) {
    const store = db.createObjectStore('userData', { keyPath: 'userId' });
    store.createIndex('userName', 'name', { unique: false });
  }
};

dbOpenRequest.onsuccess = (e) => {
  const db = e.target.result;
  console.log('データベース接続成功');
};

dbOpenRequest.onerror = (e) => {
  console.error('データベース接続失敗', e.target.error);
};
  

2. データの追加

トランザクションを開始し、オブジェクトストアにデータを追加します。


function addUserData(db, user) {
  const tx = db.transaction('userData', 'readwrite');
  const store = tx.objectStore('userData');
  const request = store.put(user);

  request.onsuccess = () => {
    console.log('データ追加成功');
  };

  request.onerror = (e) => {
    console.error('データ追加失敗', e.target.error);
  };
}
  

3. データの取得

主キーを指定してデータを取得します。


function fetchUser(db, userId) {
  const tx = db.transaction('userData', 'readonly');
  const store = tx.objectStore('userData');
  const request = store.get(userId);

  request.onsuccess = (e) => {
    const result = e.target.result;
    if (result) {
      console.log('取得データ:', result);
    } else {
      console.log('該当データなし');
    }
  };

  request.onerror = (e) => {
    console.error('データ取得失敗', e.target.error);
  };
}
  

4. データの削除

主キーを指定してデータを削除します。


function removeUser(db, userId) {
  const tx = db.transaction('userData', 'readwrite');
  const store = tx.objectStore('userData');
  const request = store.delete(userId);

  request.onsuccess = () => {
    console.log('データ削除成功');
  };

  request.onerror = (e) => {
    console.error('削除失敗', e.target.error);
  };
}
  

5. カーソルによる全データの取得

カーソルを使用して、オブジェクトストア内の全データを走査します。


function listAllUsers(db) {
  const tx = db.transaction('userData', 'readonly');
  const store = tx.objectStore('userData');
  const request = store.openCursor();

  request.onsuccess = (e) => {
    const cursor = e.target.result;
    if (cursor) {
      console.log('データ:', cursor.value);
      cursor.continue();
    } else {
      console.log('全データ取得完了');
    }
  };

  request.onerror = (e) => {
    console.error('走査失敗', e.target.error);
  };
}
  

まとめ

IndexedDBは、大量の構造化データを効率的に保存・検索するための強力な仕組みです。トランザクションやインデックスにより、複雑なデータ操作が可能で、オフラインアプリケーションの実装にも適しています。

タグ: IndexedDB WebStorage javascript ブラウザストレージ オフラインアプリケーション

6月16日 16:53 投稿