session, localStorage, cookie만 쓰다가 indexedDB를 써야할 때가 있어서 공부해 봤다.
chrome application에서 보던것만 보니 무심코 지나갔던것 같다.
WebSQL은 지원이 종료되었다고 하니 다른부분을 먼저 보는게 좋을것 같다.
const DBname = 'TestDB';
const store = 'TestStore';
export const openIDB = async () => {
return new Promise((resolve, reject) => {
if (!window.indexedDB) {
window.alert(
"Your browser doesn't support a stable version of IndexedDB."
);
reject();
}
// 1로 설정을하여 onupgradeneeded 이벤트가 작동하게함.
let request = window.indexedDB.open(DBname, 1);
request.onupgradeneeded = function (event) {
let idb = event.target.result;
if (!idb.objectStoreNames.contains(store)) {
//key를 주지 않으면 값을 추가할때 해당 key를 넘겨주지 않아도됨.
//key가 필수이라면 autoingredient를 사용해도됨
idb.createObjectStore(store);
}
};
request.onsuccess = (e) => {
resolve();
};
request.onerror = (e) => {
reject("err open the DB", e);
};
});
};
export const writeIDB = async (key, value) => {
return new Promise(async (resolve, reject) => {
const request = await window.indexedDB.open(DBname, 1);
request.onsuccess = (e) => {
const idb = e.target.result;
const transaction = idb.transaction([store], "readwrite");
const objectStore = transaction.objectStore(store);
const addRequest = objectStore.add(value, key);
addRequest.onsuccess = (e) => {
resolve();
};
addRequest.onerror = (err) => {
reject("add Data err", err);
};
};
request.onerror = (err) => {
reject("open DB err", err);
};
});
};
export const updateIDB = async (key, value) => {
return new Promise(async (resolve, reject) => {
const request = await window.indexedDB.open(DBname, 1);
request.onsuccess = (e) => {
const idb = e.target.result;
const transaction = idb.transaction([store], "readwrite");
const objectStore = transaction.objectStore(store);
const addRequest = objectStore.put(value, key);
addRequest.onsuccess = (e) => {
resolve();
};
addRequest.onerror = (err) => {
reject("update Data err", err);
};
};
request.onerror = (err) => {
reject("open DB err", err);
};
});
};
export const readIDB = async (key) => {
return new Promise(async (resolve, reject) => {
const request = await window.indexedDB.open(DBname, 1);
request.onsuccess = (e) => {
const idb = e.target.result;
const transaction = idb.transaction([store], "readonly");
const objectStore = transaction.objectStore(store);
const data = objectStore.get(key); //getAll();
data.onsuccess = (e) => {
resolve(e.target.result);
};
data.onerror = (err) => {
reject("read Err", err);
};
};
request.onerror = (err) => {
reject("open DB err", err);
};
});
};