DRYな備忘録

Don't Repeat Yourself.

IndexedDBでauto incrementなユニークキーを使いたい

資料

問題

  • objectStoreを使うにあたって、autoIncrementで一意なidっぽいものをつくりたい
  • もちろん、参照できる形で

解決

  • createObjectStoreメソッドの第二引数に与えるパラメータでObjectStoreのキーが指定できる
  • 対応しているパラメータのフィールドは以下の2種類
    • keyPath: string
      • 主キーとして指定するobjectのフィールド. これを指定した場合、このObjectStoreに保存するobjectは、かならずここで指定されたフィールドにプロパティを持たなければならない. 逆に、stringやnumberなどのプリミティブ型を保存したい場合にはこれを指定してはいけない.
    • autoIncrement: boolean
      • auto incrementなキーを指定するか否か. trueを与えると自動的に主キーが生成され、autoIncremetな挙動をする.

参照: Structuring the database - Web API インターフェイス | MDN

この二つの指定の組み合わせで挙動がそこそこ変わる. 詳しくは↑. で、今回得たいのは、autoIncrementなキーを指定することなので、以下のように指定すればよい

var store = db.createObjectStore('todo', {
    keyPath: 'my_id',      // ここで与えたものを主キーとして...
    autoIncrement: true // auto incrementalな挙動をする
});

このように指定すると、store.putなどのメソッドmy_idというフィールドを持たないObjectを渡しても、my_idというフィールドにautoIncrementな値が自動で生成されて保存される.

f:id:otiai10:20150205093909p:plain

サンプルのひな形 をもとに、createObjectStoreメソッドの引数(と、本論ではないがindexedDB.openの第二引数も都度変える必要がある)を変えてためしてみてください.

DRYな備忘録として