忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

JavaScript IndexedDB の使い方4(全データ取得)

今回は「オブジェクトストア」に登録された全てのデータを取得する方法について説明します。

全データを取得する場合でも、データ追加処理と同様にデータベースの「トランザクション」を取得し、 「トランザクション」から「オブジェクトストア」オブジェクトを取得します。
その後で「オブジェクトストア」オブジェクトの getAll メソッドで全データ取得のリクエストを行います。

getAll メソッドの書式とイベント関数の定義は以下の様になります。

// getメソッド(objectStore:「オブジェクトストア」オブジェクト)
var request = objectStore.getAll( [query , [count] ] );
request.onsuccess = function(event) {
	// 取得が成功した場合の関数宣言(event.target.result にデータの配列が返る)
};
request.onerror = function(event) {
	// 取得エラーの場合の関数宣言
};

<パラメータ>
・query:キー文字列または IDBKeyRange オブジェクトのクエリー指定
・count:返されるデータの数の指定

<戻り値>
request :IDBRequest オブジェクト
 


getAll メソッドが成功した時には event.target.result にデータの配列が返るので、ここで行いたい処理を記述します。
尚、1件のみのデータ取得の get メソッドとは異なりデータの配列が返されるので注意が必要です。

■簡単な getAll メソッドの利用

<html>
<head>
<meta charset="utf-8">
<title>test IndexedDB - allget - 1</title>
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
//	ブラウザ対応宣言
window.indexedDB      = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
window.IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || window.msIDBTransaction;
window.IDBKeyRange    = window.IDBKeyRange || window.webkitIDBKeyRange || window.msIDBKeyRange;

//	データベース(IDBDatabase)インスタンス
var	db;
//	データベース名
var	dbName = "TestDB";
//	オブジェクトストア名
var	objStoreName = "Test1";

/**
 *  DB接続処理
 */
function openDB() {
	//	データベースオープン:[名称:TestDB]
	var request = indexedDB.open(dbName);
	//オープンが正常の場合の関数宣言
	request.onsuccess = function(event) {
		//データベースインスタンス保存
		db = event.target.result;
		console.log("DBオープンOK");
	};
	//エラーの場合の関数宣言
	request.onerror = function(event){
		console.log("DBオープンエラー");
	};
}
/**
 *  全データ取得処理
 */
function getAllData() {
	//トランザクション
	var transaction = db.transaction(objStoreName, 'readonly');
	//オブジェクトストアにアクセスします。
	var objectStore = transaction.objectStore(objStoreName);
	//全データ取得
	var request = objectStore.getAll();
	//取得が成功した場合の関数宣言
	request.onsuccess = function(event) {
		var result = event.target.result;	// データ配列が返る!!
		console.log('データ:', result);
	};
	//取得エラーの場合の関数宣言
	request.onerror = function(event) {
		console.log('取得失敗。event:', event);
	};
}
</script>
</head>
<body>
    <h2>test IndexedDB - allget - 1</h2>
	<button id="buttonOpen" onclick="openDB()">DBオープン</button>
	<button id="buttonGet"  onclick="getAllData()">全データ取得</button>
    <br />
</body>
</html>


「DBオープン」ボタンをクリック後 「全データ取得」ボタンをクリックすると、 ブラウザの「ウエブ開発ツール」のコンソールにArrayデータとしてレコードの内容が表示されるのが分かります(下図参照)。


上の例では getAll メソッドの引数を指定していないので「オブジェクトストア」内の全データが返されます。


■getAll メソッドにキー範囲とデータ件数の指定


そこで getAll メソッドにキー範囲とデータ件数の指定を行い、結果を見てみます。
キー範囲は IDBKeyRange オブジェクトを使います。以下の例ではキーが '01' ~ '22' の範囲で、データ件数は4件を指定しています。

<html>
<head>
<meta charset="utf-8">
<title>test IndexedDB - allget - 2</title>
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
//	ブラウザ対応宣言
window.indexedDB      = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
window.IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || window.msIDBTransaction;
window.IDBKeyRange    = window.IDBKeyRange || window.webkitIDBKeyRange || window.msIDBKeyRange;

//	データベース(IDBDatabase)インスタンス
var	db;
//	データベース名
var	dbName = "TestDB";
//	オブジェクトストア名
var	objStoreName = "Test1";

/**
 *  DB接続処理
 */
function openDB() {
	//	データベースオープン:[名称:TestDB]
	var request = indexedDB.open(dbName);
	//オープンが正常の場合の関数宣言
	request.onsuccess = function(event) {
		//データベースインスタンス保存
		db = event.target.result;
		console.log("DBオープンOK");
	};
	//エラーの場合の関数宣言
	request.onerror = function(event){
		console.log("DBオープンエラー");
	};
}
/**
 *  全データ取得処理
 */
function getAllData() {
	//トランザクション
	var transaction = db.transaction(objStoreName, 'readonly');
	//オブジェクトストアにアクセスします。
	var objectStore = transaction.objectStore(objStoreName);
	//キーの範囲指定オブジェクト
	var query = IDBKeyRange.bound('01', '22');	//キー範囲:'01'~'22'
	//データ取得
	var request = objectStore.getAll(query, 4);	//キーの範囲指定、データ数4件
	//取得が成功した場合の関数宣言
	request.onsuccess = function(event) {
		var result = event.target.result;	// 4件のデータ配列が返る!!
		console.log('データ:', result);
	};
	//取得エラーの場合の関数宣言
	request.onerror = function(event) {
		console.log('取得失敗。event:', event);
	};
}
</script>
</head>
<body>
    <h2>test IndexedDB - allget - 2</h2>
	<button id="buttonOpen" onclick="openDB()">DBオープン</button>
	<button id="buttonGet"  onclick="getAllData()">全データ取得</button>
    <br />
</body>
</html>


「DBオープン」ボタンをクリック後 「全データ取得」ボタンをクリックすると、 ブラウザの「ウエブ開発ツール」のコンソールにArrayデータとして4件のレコードの内容が表示されるのが分かります(下図参照)。



■キーが存在しないキー範囲指定


ここでキー範囲指定オブジェクトで以下の様に、キーが存在しない設定にすると、結果として0件のデータ配列が返されますので、注意が必要です。

// [getAllData]関数のみ抜粋、その他は変更なし
function getAllData() {
	//トランザクション
	var transaction = db.transaction(objStoreName, 'readonly');
	//オブジェクトストアにアクセスします。
	var objectStore = transaction.objectStore(objStoreName);
	//キーの範囲指定オブジェクト
	var query = IDBKeyRange.bound('05', '07');	//キー範囲:'05'~'07'
	//データ取得
	var request = objectStore.getAll(query, 4);	//キーの範囲指定、データ数4件
	//取得が成功した場合の関数宣言
	request.onsuccess = function(event) {
		var result = event.target.result;	// 0件のデータ配列が返る!!
		console.log('データ:', result);
	};
	//取得エラーの場合の関数宣言
	request.onerror = function(event) {
		console.log('取得失敗。event:', event);
	};
}

「DBオープン」ボタンをクリック後 「全データ取得」ボタンをクリックすると、 ブラウザの「ウエブ開発ツール」のコンソールに0件のArrayデータとして表示されるのが分かります(下図参照)。



■キー範囲 IDBKeyRange オブジェクト


IDBKeyRange オブジェクトにはキー範囲を生成する bound , lowerBound , upperBound , only のメソッドがあります。 IDBKeyRange.bound は抽出するキー範囲を指定し、IDBKeyRange.lowerBound は指定キーより大きいか、以上のものを対象とし、 IDBKeyRange.upperBound は指定キーより小さいか、以下のものを対象とします。
また、IDBKeyRange.only は指定キーそのものが対象となります。

コードキー範囲備考
IDBKeyRange.lowerBound(X) [全キー] ≧ (X) (X) 以上のキーが対象
IDBKeyRange.lowerBound(X, true) [全キー] > (X) (X) より大きいキーが対象
IDBKeyRange.upperBound(Y) [全キー] ≦ (Y) (Y) 以下のキーが対象
IDBKeyRange.upperBound(Y, true) [全キー] < (Y) (Y) より小さいキーが対象
IDBKeyRange.bound(X, Y) (X) ≦ [全キー] ≦ (Y) (X) 以上かつ (Y) 以下のキーが対象
IDBKeyRange.bound(X, Y, true, true) (X) < [全キー] < (Y) (X) より大きくかつ (Y) より小さいキーが対象
IDBKeyRange.bound(X, Y, true, false) (X) < [全キー] ≦ (Y) (X) より大きくかつ (Y) 以下のキーが対象
IDBKeyRange.bound(X, Y, false, true) (X) ≦ [全キー] < (Y) (X) 以上かつ (Y) より小さいキーが対象
IDBKeyRange.only(Z) [キー] = (Z) キーが (Z) のものが対象



■その他注意点


今回の getAll メソッドは Internet Explorer では実装されていません。
Edge には実装されていますが Internet Explorer で全データの取得を行う場合は、カーソル処理で行う必要があります。 (2022年には IE のサポートを終了するというアナウンスが Microsoft からあったので、これからは IE をそこまで気にしなくても良くなりそうですが)

なお、カーソル処理については次の記事で紹介したいと思います。

関連する記事

⇒JavaScript IndexedDB の使い方1(データベースオープン)
⇒JavaScript IndexedDB の使い方2(データ追加)
⇒JavaScript IndexedDB の使い方3(データ取得)
⇒JavaScript IndexedDB の使い方4(全データ取得)
⇒JavaScript IndexedDB の使い方5(カーソル処理)
⇒JavaScript IndexedDB の使い方6(データ削除)







PR

コメント

コメントを書く