LoginSignup
6
3

More than 1 year has passed since last update.

Dexie.jsで始めるIndexedDB

Posted at

Dexie.jsとは

Dexie.jsは、IndexedDBのラッパーライブラリであり、JavaScriptでデータベースを簡単に扱えるようにするためのツールです。

IndexedDBとは

Web Storageの一種であり、JavaScriptでデータベースを扱うことができます。オブジェクト指向データベース(OODB)で、JavaScriptで表現可能なオブジェクト(論理値、数値、文字列、date、オブジェクト、配列、正規表現、undefined、null)や画像データなども保存できてしまいます。

5MBくらいまでであれば localStorage や sessionStorage のような WEB Storage API を使うことで実装できますが、大量のデータを扱うのには不向きです。そこで、大量のデータをブラウザ上で扱えるように IndexedDB という仕組みを作りました。ただ、IndexedDBのAPIは使いにくく複雑なため、Dexie.jsが開発されています。

Dexie.jsのユースケース

Dexie.jsは、Webアプリに最適なツールです。クライアント側で大量のデータを扱う場合や、オフラインでもアプリが動作させたい場合にDexie.jsを活用します。例えば、カレンダーアプリでイベントを追加する場合や、タスク管理アプリでタスクを追加する場合などです。

Dexie.jsの特徴

IndexedDBのAPIをより簡単に扱えます。また、Promiseベースなので、非同期処理を扱えます。ただ、IndexedDB に依存しているため、IndexedDBの仕様に則って動作させます。

記述

例えばタスク管理アプリを作成する場合、Dexie.jsを使用してデータベースを作成することもできます。以下は、Dexie.jsを使用してタスクデータを格納するオブジェクトストアを作成する方法です。

import Dexie from 'dexie';

// DBを作成
const db = new Dexie('TaskDatabase');

// ストアを定義
db.version(1).stores({
  tasks: '++id,name,completed'
});

// タスクを追加する関数
const addTask = async (task) => {
  try {
    await db.tasks.add(task);
  } catch (error) {
    console.log(error);
  }
};

// タスクを取得する関数
const getTasks = async () => {
  try {
    const tasks = await db.tasks.toArray();
    return tasks;
  } catch (error) {
    console.log(error);
  }
};

// タスクを更新する関数
const updateTask = async (task) => {
  try {
    await db.tasks.update(task.id, task);
  } catch (error) {
    console.log(error);
  }
};

// タスクを削除する関数
const deleteTask = async (taskId) => {
  try {
    await db.tasks.delete(taskId);
  } catch (error) {
    console.log(error);
  }
};

まずはDexieオブジェクトを作成し、タスクを格納するためのオブジェクトストアを定義しています。その後、タスクを追加・取得・更新・削除する関数を定義しています。

※ストアはテーブルのようなものです。

++id オートインクリメントな主キー
name タスク名を格納するためのフィールド
completed タスク完了状況を示すブール値

データ追加(add/bulkAdd)

db.notes.add({
  title: "タイトル",
  body: '本文',
  tags: ["IndexedDB", "Dexie.js"],
  updated_at: new Date()
});

データ更新(update)

let id = 2;

db.notes.update(id, {
  body: '本文を更新',
  updated_at: new Date()
});

データ追加/更新(put/bulkPut)

db.notes.put({
  id: 2,
  title: "タイトル",
  body: '本文',
  updated_at: new Date()
});

データ全件取得

db.notes
    .toArray()
    .then(function (notes) {
      console.log(notes);
    });

データ削除(delete/bulkDelete)

let id = 1;
db.notes.delete(id);

参考

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3