Implementing IndexedDB
for Persistent Storage
1. Why Use IndexedDB?
IndexedDB is a low-level API for storing structured data in the browser.
Unlike localStorage
, it can handle large amounts of data and supports advanced queries.
Use cases for IndexedDB in a PWA:
- Caching user-generated data (e.g., form inputs, drafts).
- Storing API responses to make data available offline.
- Saving preferences or session information for a personalized experience.
2. Setting Up IndexedDB in a PWA
First, we need to open a database and create an object store:
async function openDatabase() {
return new Promise((resolve, reject) => {
const request = indexedDB.open("pwa_db", 1);
request.onupgradeneeded = (event) => {
const db = event.target.result;
if (!db.objectStoreNames.contains("requests")) {
db.createObjectStore("requests", { keyPath: "id" });
}
};
request.onsuccess = (event) => resolve(event.target.result);
request.onerror = (event) => reject(event.target.error);
});
}
Now, we can store data whenever an API request is made:
async function saveDataLocally(key, data) {
const db = await openDatabase();
const tx = db.transaction("requests", "readwrite");
const store = tx.objectStore("requests");
await store.put({ id: key, data });
}
3. Retrieving Data from IndexedDB
When a user is offline, we can fetch the stored data instead of making API calls:
async function getDataFromIndexedDB(key) {
const db = await openDatabase();
const tx = db.transaction("requests", "readonly");
const store = tx.objectStore("requests");
return await store.get(key);
}