LocalForage を使ってアプリ内 DB を簡単構築

Mozilla 財団がリリースしている LocalForage というライブラリがある。IndexedDB、WebSQL、LocalStorage の操作をラップし、いずれの技術の場合でも同じ API でデータの保存や取り出しが行えるようになっている。

目次

LocalForage をインストールする

LocalForage は npm でインストールするのが一番使いやすいだろう。

$ npm install localforage --save

TypeScript ではこんな感じで import すれば OK。

import * as localforage from 'localforage';

コールバック形式と Promise 形式

LocalForage はコールバック関数で書く方法と、Promise スタイルの2つの書き方に対応している。

// コールバック関数を渡す方法
localforage.setItem('my-key', 'my-value', function(setError) {
  // setError が null なら成功
  localforage.getItem('my-key', function(getError, value) {
    // getError が null なら成功・引数 value に取得した値が入っている
  });
});

// Promise スタイルで書く方法
localforage.setItem('my-key', 'my-value')
  .then(() => {
    return localforage.getItem('my-key');
  })
  .then((value) => {
    // 値を取得する
  })
  .catch((error) => {
    // エラー時
  });

今回はいずれも Promise スタイルで記載するサンプルを紹介する。

LocalForage インスタンスを生成する

まずは LocalForage インスタンスを作る。インスタンスが複数要らない場合は config() メソッドを使ってグローバル変数である localforage に処理を持たせても良いが、大抵は複数の DB を持ったりしたいと思うので、createInstance() を使って LocalForage インスタンスを生成する書き方を紹介する。

const myLF = localforage.createInstance({
  driver   : localforage.LOCALSTORAGE  // LocalStorage を使用する
  name     : 'MyLocal',                // 名前空間
  storeName: 'example',                // 名前空間内のインスタンスの識別名
  version  : 1                         // バージョン
});

ココでは LocalStorage を使っている。WebSQL を使用している場合は size オプションも指定できる。

以降のサンプルではココで生成した myLF を使っていく。

データを保存する

データの保存には setItem() を使う。

myLF.setItem('キー', ['保存したい値', '文字列や数値だけでなく', '配列やオブジェクトも渡せる'])
  .then(() => {
    // 保存成功
  })
  .catch((error) => {
    // 保存失敗
  });

通常の LocalStorage の場合は JSON.stringify() が必要になったりするが、LocalForage の場合はそのあたりをよしなにやってくれるので、配列やオブジェクトをそのまま渡せる。

データを取得する

setItem() で保存したデータを取得するには getItem() を使う。

myLF.getItem('キー')
  .then((value) => {
    // キーに紐付く値がない場合、引数 value は null になる
    // setItem() で値に undefined を保存した場合も null が返却される
    if(!value) {
      // 値なし
    }
    
    // value を呼び出し元に渡したり…
  })
  .catch((error) => {
    // 取得失敗
  });

こんな感じ。こちらも JSON.parse() したりしなくて良いので楽ちん。


基本はこのぐらいで済むかしら。

その他の API は公式を参照のこと。サンプルコード付きなので分かりやすい。