IndexedDB使用とピットガイド
12661 ワード
概要
この文書では、IndexedDB
の使用方法と使用シーンについて説明し、よくある質問に答えます.
また,MDNにおける関連文書は関連論理性に乏しいため,容易に理解できない.この文書では、プロジェクトで一般的なデータストレージと操作要件によってコンテンツの組織を行います.
読者は、本明細書でIndexedDB
をプロジェクトで正しく使用することを学び、アプリケーションにローカルストレージ能力をもたらし、一般的な問題を回避することができる.
理由:開発者はローカルで永続的なストレージを必要とする
いくつかの大きなSPAページの開発を行うには、いくつかのデータのローカルストレージが必要です.
データ量が少ない場合は、SessionStorageまたはLocalStorageで保存できますが、データ量が大きい場合や、一定の仕様に合致する場合は、データベースを使用してデータの保存を行うことができます.
ブラウザが提供するデータベースには、web sql
とIndexedDB
の2種類があります.HTML 5が廃棄されたweb sql
よりもIndexedDB
の方がおすすめです.
こうぞう
次に,IndexedDB全体の構造を1枚の図で理解する.
クラス比sql
型データベース、IndexedDB
中のDB(データベース)はsql
中のDBであり、Object Store( )
は
、Item
は表中の1本の
に等しい.
IndexedDBの使用
ここでは、IndexedDB
の構造に基づいて動作を紹介し、このストレージスペースについて初歩的な理解を得ることができます.主に次のように説明します.
いくつかの大きなSPAページの開発を行うには、いくつかのデータのローカルストレージが必要です.
データ量が少ない場合は、SessionStorageまたはLocalStorageで保存できますが、データ量が大きい場合や、一定の仕様に合致する場合は、データベースを使用してデータの保存を行うことができます.
ブラウザが提供するデータベースには、
web sql
とIndexedDB
の2種類があります.HTML 5が廃棄されたweb sql
よりもIndexedDB
の方がおすすめです.こうぞう
次に,IndexedDB全体の構造を1枚の図で理解する.
クラス比sql
型データベース、IndexedDB
中のDB(データベース)はsql
中のDBであり、Object Store( )
は
、Item
は表中の1本の
に等しい.
IndexedDBの使用
ここでは、IndexedDB
の構造に基づいて動作を紹介し、このストレージスペースについて初歩的な理解を得ることができます.主に次のように説明します.
ここでは、
IndexedDB
の構造に基づいて動作を紹介し、このストレージスペースについて初歩的な理解を得ることができます.主に次のように説明します.データベース操作
データベースの作成または開く
IndexedDB
の最初のステップは、データベースを作成または開くことです.window.indexedDB.open(DBName)
というAPIを使用して操作を行います.具体例は次のとおりです.const request = window.indexedDB.open('test');
request.onupgradeneeded = function (event) {
}
request.onsuccess = function(event) {
//request === event.target;
}
request.onerror = function(event) {}
このインタフェースを呼び出すと、現在のデータベースが存在しない場合、新しいデータベースが作成されます.
データベースが接続を確立すると、
IDBOpenDBRequest
オブジェクトが返されます.接続が正常に確立されると、
onsuccess
イベントがトリガーされ、関数パラメータevent
のtarget
属性がrequest
オブジェクトになります.データベースの作成またはバージョンの更新時に
onupgradeneeded
イベントがトリガーされます.データベースのバージョン番号の更新
window.indexedDB.open
の2番目のパラメータはバージョン番号です.指定しない場合、デフォルトのバージョン番号は1です.具体例は次のとおりです.const request = window.indexedDB.open('test', 2);
データベースの
schema( )
を更新する必要がある場合は、バージョン番号を更新する必要があります.このとき、以前のバージョンよりも高いバージョン番号を指定すると、onupgradeneeded
イベントがトリガーされます.同様に、このデータベースが存在しない場合もイベントがトリガーされ、バージョンがセットトップバージョンに更新されます.バージョン番号は
Unsigned long long
の数字であり、これは非常に大きな整数であることを意味します.ただし、小数ではありません.そうしないと、最も近い整数に変換され、onUpgradeneeded
イベントがトリガーされない可能性があります.きおくくうかんさぎょう
ストレージスペースの作成
createObjectStore
を使用してストレージスペースを作成します.同時に、createIndex
を使用してインデックスを作成します.具体例は次のとおりです.var request = window.indexedDB.open('test', 1);
request.onupgradeneeded = function (event) {
var db = event.target.result;
var objectStore = db.createObjectStore('table1', {keyPath: 'id', autoIncrement: true});
objectStore.createIndex('name', 'name', {unique: false});
}
request.onerror = function (event) {
alert("Why didn't you allow my web app to use IndexedDB?!");
};
注意:
onupgradeneeded
コールバック関数でのみストレージスペースを作成できますが、データベースが開いたsuccess
コールバック関数では作成できません.createObjectStore
によってストレージスペースを作成できます.2つのパラメータを受け入れます.customers
です.keyPath
の値を記憶対象の属性として指定し、この属性は記憶空間データを取得する際にkey値として使用することができる.autoIncrement
は、key
の値が増加したかどうかを指定します(key値がデフォルトの1から2^53までの整数の場合).createIndex
は、現在の記憶領域にインデックスを設定することができる.3つのパラメータを使用できます.unique
の値がtrue
であることは、インデックス値が等しくないことを示す.データ操作
取引
IndexedDB
では、トランザクションを使用してデータベースの操作を行うこともできます.トランザクションには3つのパターンがあります(定数は破棄されました):readOnly
、読み取り専用です.readwrite
、読み書き.versionchange
、データベースバージョンが変更されました.トランザクションを作成する場合は、上からモードを選択する必要があります.指定しない場合は、デフォルトは読み取り専用モードです.具体例は次のとおりです.
const transaction = db.transaction(['customers'], 'readwrite');
トランザクション関数
transaction
の最初のパラメータは、関連付けが必要な記憶領域であり、2番目のオプションパラメータはトランザクションモードである.上記と同様に、トランザクションが成功するとonsuccess
関数がトリガーされ、失敗するとonerror
関数がトリガーされます.トランザクションの操作はすべて原子的です.
データの追加
ストレージスペースの初期化が完了すると、ストレージスペースにデータを入れることができます.
add
メソッドを直接呼び出すと、データを記憶領域に格納できます.具体的な例は以下のとおりです.var request = window.indexedDB.open('test', 1);
request.onsuccess = function (event) {
var db = event.target.result;
var transaction = db.transaction(['table1'], 'readwrite');
var objectStore = transaction.objectStore('table1');
var index = objectStore.index('name');
objectStore.add({name: 'a', age: 10});
objectStore.add({name: 'b', age: 20});
}
注意:
add
メソッドの2番目のパラメータkey値は、指定された記憶領域のkeyPath
値です.data
にkeyPath
値が含まれている場合、またはこの値が自己付加価値である場合、このパラメータは省略できます.データの検索
特定の値によるデータの取得
ストレージスペースからデータを取得する必要がある場合は、次の方法でデータを取得できます.
var request = window.indexedDB.open('test', 1);
request.onsuccess = function (event) {
var db = event.target.result;
var transaction = db.transaction(['table1'], 'readwrite');
var objectStore = transaction.objectStore('table1');
var request = objectStore.get(1);
request.onsuccess = function (event) {
// request.result !
console.log(request.result);
};
request.onerror = function (event) {
// !
};
}
カーソルによるデータの取得
ストレージスペース全体のデータを便利にする必要がある場合は、カーソルを使用する必要があります.カーソルの使用方法は次のとおりです.
var request = window.indexedDB.open('test', 1);
request.onsuccess = function (event) {
var db = event.target.result;
var transaction = db.transaction(['table1'], 'readwrite');
var objectStore = transaction.objectStore('table1');
var request = objectStore.openCursor();
request.onsuccess = function (event) {
var cursor = event.target.result;
if (cursor) {
// Object.assign
console.log(Object.assign(cursor.value));
cursor.continue();
}
};
request.onerror = function (event) {
// !
};
}
カーソルを使用するときに注意すべき点は、カーソルがストレージ領域全体を便利にしているが、所定の条件の値が見つからない場合でも、
onsuccess
関数がトリガーされます.openCursor
とopenKeyCursor
には2つのパラメータがあります.IDBKeyRange
パラメータの方法によって取得される.範囲パラメータの具体例は、// key === 1
const singleKeyRange = IDBKeyRange.only(1);
// key >= 1
const lowerBoundKeyRange = IDBKeyRange.lowerBound(1);
// key > 1
const lowerBoundOpenKeyRange = IDBKeyRange.lowerBound(1, true);
// key < 2
const upperBoundOpenKeyRange = IDBKeyRange.upperBound(2, true);
// key >= 1 && key < 2
const boundKeyRange = IDBKeyRange.bound(1, 2, false, true);
index.openCursor(boundKeyRange).onsuccess = function(event) {
const cursor = event.target.result;
if (cursor) {
// Do something with the matches.
cursor.continue();
}
};
IDBCursor
の定数が破棄された)によって取得される.次のようになります.next
は、移動後から全てのデータ(重複データを含む)prev
は、後から全てのデータ(重複データを含む)nextunique
は、行き先からデータを取得する(重複データは第1条のみ、インデックス重複は重複とみなす、以下同)prevunique
、後進からデータを取得する(重複データは第1条のみ取る)ループ順序パラメータの具体例は次のとおりです.
var request = window.indexedDB.open('test', 1);
request.onsuccess = function (event) {
var db = event.target.result;
var transaction = db.transaction(['table1'], 'readwrite');
var objectStore = transaction.objectStore('table1');
var lowerBoundOpenKeyRange = IDBKeyRange.lowerBound(1, false);
var request = objectStore.openCursor(lowerBoundOpenKeyRange, IDBCursor.PREV);
request.onsuccess = function (event) {
var cursor = event.target.result;
if (cursor) {
// Object.assign
console.log(Object.assign(cursor.value));
cursor.continue();
}
};
request.onerror = function (event) {
// !
};
}
索引の使用
前にデータベースを構築したとき、2つのインデックスを作成しました.インデックスによるデータ取得も可能になりました.彼の本質は,以前にデータを取得したAPIによって行われたが,従来用いられていた
keyPath
属性をインデックス指定属性に変換しただけである.具体例は次のとおりです.var request = window.indexedDB.open('test', 1);
request.onsuccess = function (event) {
var db = event.target.result;
var transaction = db.transaction(['table1'], 'readwrite');
var objectStore = transaction.objectStore('table1');
var index = objectStore.index('name');
// ,get
index.get('a').onsuccess = function (event) {
console.log(event.target.result);
}
// ,
index.openCursor().onsuccess = function (event) {
console.log('openCursor:', event.target.result.value);
}
// , , : value ,
index.openKeyCursor().onsuccess = function (event) {
console.log('openKeyCursor:', event.target.result);
}
}
データの変更
ストレージ領域のデータを変更する必要がある場合は、次のAPIを使用します.
var objectStore = transaction.objectStore("customers");
var request = objectStore.put(data);
request.onsuccess = function (event) {
}
注:
put
メソッドは、既存のデータを修正するだけでなく、ストレージスペースに新しいデータを追加することもできます.データの削除
不要なデータを削除する必要がある場合は、次の方法で実行できます.
var objectStore = transaction.objectStore("customers");
var request = objectStore.delete(name);
request.onsuccess = function (event) {
}
例外処理
ブラウザで次の操作が行われている場合、indexedDBに異常が発生する可能性があります.
この場合,エラーをキャプチャし,ユーザにヒントを与える必要がある.この章は本文の重点ではなく,これ以上省略する.
拡張の注意事項
値の関連付け
key値が許容できるデータ型
IndexedDB
では、キー値ペアのkey
の値は、以下のいくつかのタイプの値を受け入れることができる.
詳細については、文書ここを参照してください.
key pathが許容できるデータ型
key
の値がプライマリ・キー、すなわちkeyPath
になると、その値は以下の数種類しかありません.注意:key pathにスペースは表示されません.
詳細については、文書ここを参照してください.
valueが許容できるデータ型
IndexedDB
において、valueは、例えばString、Date、ImageDateなどのECMA−262のすべてのタイプの値を受け入れることができる.取引関連
トランザクションが中断されるとkey値の自己増加に影響しますか?
IndexedDB
は、key値が指定されていない場合に自己増加したkey値を採用する.トランザクションが途中で中断された場合、key値の自己増加は、中断されたトランザクションが開始される前のkeyから開始されます.セキュリティ関連
IndexedDB
もブラウザどうげんせんりゃくによって制限されている.ユーザー関連
キャッシュをクリア
ユーザーがブラウザキャッシュをクリアすると、
IndexedDB
に関連するデータがクリアされる可能性があります.アクセス権
一部のブラウザでは、Safariの携帯電話版プライバシーモードのように
IndexedDB
にアクセスすると、権限がないことによる異常(LocalStorage)が発生し、異常処理が必要になる場合があります.