戻る

select
indexedDB

indexedDBでselectをする処理です。
indexedDBではgetAllメソッドを使用してデータを取得できます。

[サンプル]
copy
async function sampleTest(dbName, storeName) 
{
	let version = 1;
	const db = await openDatabase(dbName, version, (db) => 
	{
		if (!db.objectStoreNames.contains(storeName)) 
		{
			const store = db.createObjectStore(storeName, { keyPath: "f1" });
			store.createIndex("f2", "f2", { unique: false });
			store.createIndex("f3", "f3", { unique: false });
		}
	});
	
	//select all
	const rows = await runTx(db, storeName, "readonly", (store) => 
	{
		return new Promise((resolve, reject) => 
		{
			const req = store.getAll();
			req.onsuccess = () => resolve(req.result);
			req.onerror = () => reject(req.error);
		});
	});
	
	rows.forEach(r => console.log(`f1:${r.f1}, f2:${r.f2}, f3:${r.f3}`));
	db.close();
}
function waitForTx(tx) 
{
	return new Promise((resolve, reject) => 
	{
		tx.oncomplete = () => resolve();
		tx.onabort = () => reject(tx.error ?? new Error("Transaction aborted"));
		tx.onerror = () => reject(tx.error);
	});
}

async function runTx(db, storeName, mode, work) 
{
	const tx = db.transaction([storeName], mode);
	const store = tx.objectStore(storeName);
	const result = await work(store);
	await waitForTx(tx);
	return result;
}

function openDatabase(dbName, version, upgrade) 
{
	return new Promise((resolve, reject) => 
	{
		const req = indexedDB.open(dbName, version);
		req.onupgradeneeded = (event) => 
		{
			const db = event.target.result;
			upgrade?.(db, event);
		};
		req.onsuccess = (event) => 
		{
			resolve(event.target.result);
		};
		req.onerror = () => reject(req.error);
	});
}
sampleTest("aaa", "t1");

このサンプルではデータベースの更新処理(テーブル削除など)がなかったと仮定したものです。insertでデータが入っているものと仮定します。
const db = await openDatabase(dbName, version, (db) =>
データベースをopenします。

if (!db.objectStoreNames.contains(storeName))
引数にあるオブジェクトスキーマが存在しない場合は作成します。

await runTx(db, storeName, "readwrite", (store) =>
トランザクションの完了を待つためにinsertの処理内容をrunTxを使用して非同期処理の待機をしています。
この例であればadd(オブジェクトスキーマにデータを登録するためのメソッド)を実行した結果をstoreに渡します。
runTxでは「store.getAll();」でデータの取得をします。

store.getAll()は非同期処理です。
Promiseでawaitしているのでデータを取得するまで待機します。
その結果がgetAllで取得したデータ配列として「resolve(req.result)」で配列が渡されます。
const rows = await runTx...
のrowsが配列結果となりデータが入った結果をforEachで順次出力しています。

await waitForTx(tx);
トランザクションの完了の結果を受け取るまで待ち状態となります。

upgrade?.(db, event);
upgradeはopenDatabase関数の関数型引数です。

const db = await openDatabase(dbName, version, (db) =>
の処理内部を渡しています。
つまりオブジェクトスキーマが存在しない場合は作成するという処理です。

?.
「?.」はオプショナルチェーン演算子です。
エラーを発生する代わりにundefinedを返す機能です。




戻る


著作権情報
ホームページおよプリ等に掲載されている情報等については、いかなる保障もいたしません。
ホームページおよびアプリ等を通じて入手したいかなる情報も複製、販売、出版または使用させたり、
または公開したりすることはできません。
当方は、ホームペーよびアプリ利用したいかなる理由によっての障害等が発生しても、
その結果ホームページおよびアプリ等を利用された本人または他の第三者が被った損害について
一切の責任を負わないものとします。