IndexedDB không phải là nơi lưu trữ khóa-giá trị theo cách giống như Local Storage. Bộ nhớ cục bộ chỉ lưu trữ các chuỗi, vì vậy, để đặt một đối tượng vào bộ nhớ cục bộ, cách tiếp cận thông thường là JSON.stringify nó:
myObject = {a: 1, b: 2, c: 3};
localStorage.setItem("uniq", JSON.stringify(myObject));
Điều này là tốt cho việc tìm kiếm đối tượng có khóa uniq
, nhưng cách duy nhất để lấy lại các thuộc tính của myObject khỏi bộ nhớ cục bộ là JSON. Phân tích đối tượng và kiểm tra nó:
var myStorageObject = JSON.parse(localStorage.getItem("uniq"));
window.alert(myStorageObject.b);
Điều này là tốt nếu bạn chỉ có một hoặc một vài đối tượng trong bộ nhớ cục bộ. Nhưng hãy tưởng tượng bạn có một nghìn đối tượng, tất cả đều có thuộc tính b
và bạn muốn làm điều gì đó chỉ với những đối tượng đó ở đâu b==2
. Với bộ nhớ cục bộ, bạn sẽ phải xem qua toàn bộ cửa hàng và kiểm tra b
từng mặt hàng, việc xử lý này rất lãng phí.
Với IndexedDB, bạn có thể lưu trữ những thứ khác ngoài chuỗi trong giá trị : "Điều này bao gồm các loại đơn giản như DOMString và Date cũng như các thể hiện Đối tượng và Mảng." Không chỉ vậy, bạn có thể tạo chỉ mục trên thuộc tính của các đối tượng mà bạn đã lưu trữ trong giá trị. Vì vậy, với IndexedDb, bạn có thể đặt cùng một nghìn đối tượng đó nhưng tạo một chỉ mục trên thuộc b
tính và sử dụng chỉ mục đó để chỉ truy xuất các đối tượng mà b==2
không cần quét mọi đối tượng trong cửa hàng.
Ít nhất đó là ý tưởng. API IndexedDB không trực quan lắm.
Chúng dường như chạy trong cùng một chuỗi khi các lệnh gọi không đồng bộ được thực hiện. Làm thế nào điều này sẽ không chặn giao diện người dùng?
Không đồng bộ không giống với đa luồng, JavaScript, theo quy tắc, không phải là đa luồng . Bất kỳ xử lý nặng nào bạn thực hiện trong JS sẽ chặn giao diện người dùng, nếu bạn muốn giảm thiểu việc chặn giao diện người dùng, hãy thử Web worker .
indexedDB cho phép một cửa hàng lớn hơn. Tại sao không tăng kích thước của cửa hàng HTML5?
Bởi vì, nếu không lập chỉ mục thích hợp, nó sẽ ngày càng chậm hơn khi lớn hơn.