戻る

order by(単一フィールド)
indexedDB

sqlでいうorder byはopenCursorの第2引数で設定することで
並び替えをしたデータを取得できます。
第2引数に設定します。
第1引数は範囲を指定する場所なので未使用の場合はnullを設定します。
next昇順(SQLでいうasc)
prev降順(SQLでいうdesc)

[サンプル]
copy
//sortType:[0]asc [1]desc
async function testOrderBy(dbName, storeName, sortType) 
{
	const db = await databaseOpen(dbName);
	await runTx(db, storeName, "readwrite", (store) => 
	{

		// get cursor data
		const transaction = db.transaction([storeName], 'readonly');
		const objectStore = transaction.objectStore(storeName);
		const index = objectStore.index('f1'); //use "f1" index
		
		const cursorRequest = index.openCursor(null, sortType == 0 ? "next" : "prev");
		cursorRequest.onsuccess = (event) => 
		{
			const cursor = event.target.result;
			if (cursor) 
			{
				console.log(cursor.value); //display sort cursor data
				cursor.continue();
			} 
			else 
			{
				console.log('get all of data.');
			}
		};

	});
	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 databaseOpen(dbName) 
{
	return new Promise((resolve, reject) => 
	{
		const req = indexedDB.open(dbName);
		req.onsuccess = (event) => 
		{
			resolve(event.target.result);
		};
		req.onerror = () => reject(req.error);
	});
}
testOrderBy("sampleDB", "t2", 0);
console.log("-----");
testOrderBy("sampleDB", "t2", 1);

テストデータが入っている仮定します。

const transaction = db.transaction([storeName], 'readonly');
const objectStore = transaction.objectStore(storeName);
既存のオブジェクトスキーマ(テーブル)を使用可能状態にします。

const index = objectStore.index('f1');
このサンプルでは下記のレイアウトを使用しています。
const store = db.createObjectStore("t2", { keyPath: "f0" });
store.createIndex("f1", "f1", { unique: false });
store.createIndex("f2", "f2", { unique: false });
store.createIndex("f3", "f3", { unique: false });
store.createIndex("f4", "f4", { unique: false });
index('f1')としているのでf1フィールドをソートの対象としています。
また、主キーはソートのキーフィールドとはならないようです。
そのためcreateIndexで設定したフィールドを指定してください。

const cursorRequest = index.openCursor(null, sortType == 0 ? "next" : "prev");
カーソルのタイプを関数の引数により設定します。
openCursorメソッドの第2引数に値を設定することで並び替えが実行できるようになります。
このとき、範囲を指定しない場合は第1引数にnullを設定してください。

cursorRequest.onsuccess = (event) =>
カーソルが正しくopenできた場合のイベントです。

const cursor = event.target.result;
カーソルを準備します。

console.log(cursor.value);
カーソルのレコードを出力しています。

cursor.continue();
次のカーソルをコールします。



戻る


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