概要は前回書いてるので今回は少し踏み込んで解説します。
IndexedDB初期化処理
/** * db初期化 */ function dbInit() { try { var datatable = document.getElementById("datatable"); var dbNamre = "Test"; var version = 1.0; var openRequest = indexedDB.open("dbNamre", version); openRequest.onupgradeneeded = function (event: IDBVersionChangeEvent) { // データベースのバージョンに変更があった場合(初めての場合もここを通ります。) var old = event.oldVersion; //前のバージョン var db = openRequest.result; var store = db.createObjectStore("data1", { keyPath: "mykey", autoIncrement:true }); var store = db.createObjectStore("data2"); // 削除も可能 // db.deleteObjectStore("name") // あとからインデックス作成も可能 index 作成 引数:index名(識別用) //store.createIndex("indexName", "mykey" ); }; //成功時コールバック openRequest.onsuccess = function (event) { var db = openRequest.result; console.log(openRequest.result); }; //失敗時コールバック openRequest.onerror = function (err: Event) { }; } catch (e) { console.log(e); } }open時にversionの値を挙げると新しく作成し直すことができます。
更新時は前回の構成を保持するようです。
DB構成は作成時か更新時にのみ定義することができます。
主キーに"mykeyを設定しつつオートインクリメントするようにしています。"
後は見ればわかるかな。
Developer ToolsのResources → IndexedDBから作成したDBを確認できます。
IndexedDB書き込み処理
/** DB書き込み */ function save() { var dbName = "Test"; var version = 2; var openRequest = indexedDB.open(dbName, version); openRequest.onsuccess = function (event: IDBVersionChangeEvent) { var db: IDBDatabase = openRequest.result; // トランザクション作成 var transaction = db.transaction("data1", "readwrite"); var objectStore = transaction.objectStore("data1"); /* var req = objectStore.add({ test: "value3", test2: "value4" }); */ var req = objectStore.add({ test: "value" }); req.onsuccess = function (e) { console.log("追加に成功しました", openRequest.result); }; req.onerror = function (e) { console.log("追加に失敗しました", openRequest.error); }; } }autoIncrement:trueにしているので自動で連番が入ってきます。
autoIncrement:falseの場合は必ずvalueにキーを指定する必要があります。
ちなみにvalueは形式が決まっておらず割りとなんでも入れられます。
この辺混乱する人がいるかも。
IndexedDB読み込み処理
function load() { var dbName = "Test"; var version = 2; var openRequest = indexedDB.open(dbName, version); openRequest.onsuccess = function (event: IDBVersionChangeEvent) { var db: IDBDatabase = openRequest.result; // トランザクション作成 var transaction = db.transaction("data1", "readwrite"); var objectStore = transaction.objectStore("data1"); // カーソル作成 var req = objectStore.openCursor(null, "next"); req.onsuccess = function (e) { //最初カーソルができたときもadvanceでカーソルが進んだときも呼ばれるイベントハンドラ if (req.result == null) { //IDBRequestのresultがnullのときは、もうデータがない console.log("終了しました。"); } else { //IDBRequestのresultはIDBCursorWithValueである var cursor = req.result; console.log(cursor.value); //そのレコードを表示 //次のレコードに進む cursor.advance(1); } } req.onerror = function (e) { console.log("取得に失敗しました", openRequest.error); }; } }こんな感じで出力される
IDBDatabase {}name: "Test"objectStoreNames: DOMStringListonabort: nullonclose: nullonerror: nullonversionchange: nullversion: 2__proto__: IDBDatabase
app.ts:413 Object {test: "value3", test2: "value4", mykey: 1}
app.ts:413 Object {test: "value", mykey: 2}
app.ts:409 終了しました。
app.ts:413 Object {test: "value3", test2: "value4", mykey: 1}
app.ts:413 Object {test: "value", mykey: 2}
app.ts:409 終了しました。
補足
javascriptの場合は: 型名の部分を除外すれば動作します。
indexedDB.deleteDatabase("dbName")で削除が可能
DB名 → openで指定した名前
テーブル名 → ObjectStore
レコード → レコード(ただし自由度が高い)
って解釈でいいだろうか?
検索周りは後日