Table of Content
Introduction
Kenapa saya ingin menulis tentang Indexed DB?
Saya mendapatkan project dari PAS dari permintaan manager(bu Linda) bahwa saya dipercaya untuk membuat project untuk departemen ENG yg bernama SDP (Sub Distribution Panel). SDP ini kan titik device nya bisa dimana aja ya. Nah problemnya itu di koneksi internet yg tidak stabil. Indexed DB lah yang bisa mengatasi problem tersebut.
IndexedDB adalah sebuah database di dalam browser yang memungkinkan aplikasi web untuk menyimpan data secara terstruktur dan melakukan pencarian yang efisien. Berbeda dengan penyimpanan lokal sederhana, seperti localStorage, IndexedDB dapat menyimpan sejumlah besar data dan mendukung operasi transaksi, indeks, dan query yang kompleks.
Berikut adalah beberapa fitur utama dari IndexedDB:
- Penyimpanan Data Besar: Dapat menyimpan data dalam jumlah yang jauh lebih besar dibandingkan localStorage.
- Struktur Data: Memungkinkan penyimpanan objek JavaScript, bukan hanya string.
- Transaksi: Mendukung transaksi untuk memastikan integritas data.
- Indeks: Memungkinkan pencarian data yang lebih cepat dengan membuat indeks.
- Asynchronous API: Operasinya bersifat non-blocking, sehingga tidak akan mengganggu kinerja antarmuka pengguna.
IndexedDB sangat berguna untuk aplikasi web yang memerlukan penyimpanan data yang kompleks dan besar, seperti aplikasi offline, aplikasi pemrosesan data, atau aplikasi dengan data pengguna yang banyak.
Starter
const dbName = 'MesinDB';
const storeName = 'mesinStore';
let db;
function initDB() {
const request = indexedDB.open(dbName, 1);
request.onupgradeneeded = function (event) {
db = event.target.result;
db.createObjectStore(storeName, { keyPath: 'id' });
};
request.onsuccess = function (event) {
db = event.target.result;
console.log('Database berhasil dibuka');
loadDataFromIndexedDB();
};
request.onerror = function (event) {
console.error('Kesalahan database:', event.target.errorCode);
};
}Penjelasan
indexedDB.open(dbName, 1): intinya disini kita harus open database yg kita buat (ini nama databasenya bebas ya) dan versi1.onupgradeneededdipanggil ketika database perlu diupgrade, seperti saat pertama kali dibuat atau jika versi database lebih rendah dari yang diminta.db = event.target.result;: Menyimpan referensi ke database yang baru dibuat atau diupgrade.db.createObjectStore(storeName, { keyPath: 'id' });: Membuat object store baru dengan namamesinStoredan menentukan bahwaidadalahkeyPath, yang berarti setiap objek dalam store harus memiliki propertiidyang unik.onsuccessdanonerroritu bila di ajax miripsuccessdanerror- Setelah di bungkus pakai function jangan lupa di panggil!
Read Data
function loadDataFromIndexedDB() {
const transaction = db.transaction([storeName]);
const store = transaction.objectStore(storeName);
const request = store.getAll();
request.onsuccess = function (event) {
console.log('Semua data:', event.target.result);
};
}Penjelasan:
- pertama tama kita harus buat nama transaction nya dulu
- mengakses objectstore
- Menggunakan metode
getAlluntuk mengambil semua data yang ada di object store. (bentuknya array) - request on success itu dijalankan ketika operasi dinyatakan berhasil.
Store Data
function addDataToIndexedDB(data) {
const transaction = db.transaction([storeName], 'readwrite');
const store = transaction.objectStore(storeName);
store.add(data);
}Penjelasan:
- Seperti sebelumnya buat transaksi dan objectStore
- disitu kita menetapkan
readwriteyang artinya bisa read dan create
Sinkron Data Ketika Online
function syncData() {
const transaction = db.transaction([storeName]);
const store = transaction.objectStore(storeName);
const request = store.getAll();
request.onsuccess = function(event) {
const dataToSync = event.target.result;
if (dataToSync.length > 0) {
dataToSync.forEach(item => {
$.ajax({
url: '/sdp/master/mesin',
type: 'POST',
data: item,
success: function(response) {
table();
removeFromLocalDB(item.id);
console.log("Sukses menyinkronkan data!");
},
error: function(xhr) {
console.error("Gagal menyinkronkan data:", xhr);
}
});
});
}
};
}Penjelasan:
- Sama seperti sebelumnya kita harus buat transaction dan objectStore nya
- di bagian request ibaratnya ini kita lagi nge-query
- nah setelah data ditemukan (onsuccess) maka data disinkronkan pakai ajax.
- Intinya ketika offline disimpan di browser, setelah online baru kirim ke server dengan syarat tidak boleh di refresh.
Update
function updateDataInIndexedDB(data) {
const transaction = db.transaction([storeName], 'readwrite');
const store = transaction.objectStore(storeName);
const request = store.put(data);
request.onsuccess = function() {
console.log('Data berhasil diperbarui di IndexedDB');
};
request.onerror = function(event) {
console.error('Gagal memperbarui data di IndexedDB:', event.target.error);
};
}Penjelasan:
- gunakan put untuk perbarui data
Remove Data
function removeFromLocalDB(id) {
const transaction = db.transaction([storeName], 'readwrite');
const store = transaction.objectStore(storeName);
store.delete(id);
}Penjelasan:
- readwrite bisa digunakan untuk crud
- gunakan delete untuk menghapus!
Kesimpulan
- IndexedDB itu cocok buat user yg tidak stabil koneksinya atau aplikasi offline.
- IndexedDB itu database nya browser.
- Flownya
- open database dg version yg sama
- buat transaksi dengan tipe nya seperti readonly atau readwrite
- buat objectStore
- object nya diquery
Date: 24-10-2024