[Javascript] Indexed Database
Bài đăng này đã không được cập nhật trong 6 năm
Lần trước thì mình có giới thiệu về phần Storage thì lần này mình xin phép được tiếp tục giới thiệu đến mọi người về Indexed Database . Có thể coi Indexed DB nó là phần tiến hoá của Storage nên là nó cũng là một loại DB được tạo ra từ JS và được lưu lại trên browser. so với thằng localStorage thì nó không chỉ mạnh hơn ở điểm là lưu được dưới dạng chuỗi mà còn có thể lưu dưới dạng object thêm nữa thì có thêm cả chức năng tìm kiếm.
Trước kia thì quy định về mặt kỹ thuật của Client-Side DB (WebSQL) được sử dụng như là SQL nhưng mà nó đã bị loại bỏ và IndexedDB được sử dụng như là 1 API DB mới với hướng là không sử dụng SQL. IndexedDB thì có 2 phiên bản là 1 và 2 hôm nay thì mình sẽ đi giới thiệu về phiên 1 trước.
Cấu Tạo Của Database của IndexedDB
Database thì cũng share bởi orgin như là localStorage. thêm nữa Database thì có thể tạo được nhiều DB ở trong cùng 1 orgin và được phân biệt bằng tên của DB. thêm đó thì DB có cả phần version .khi mà mà ứng dụng phát triển thì phần spec của DB cũng thay đổi và khả năng xảy ra sự không tương thích cũng có thể xảy ra tuy nhiên DB có phần thông tin theo version nên chúng ta có thể tránh được việc xảy ra sự không tương thích chi tiết thì mình sẽ trình bày ở phần sau .Đương nhiên thì với 1 DB nó có thể lưu trữ và đưa thông tin vào DB là chuyện không cần phải bàn )) . data thì mỗi một dữ liệu sẽ là 1 record với với Key và Value .
Ngay từ phần tên chúng ta đã thấy, Key nó như là phần tên của một record, và phần value là phần chứa dữ liệu. key thì có thể sử dụng để chúng ta sắp xếp record.
có thể tưởng tượng DB lưu trữ các object store và phần dữ liệu chúng ta sẽ được lưu trữ trong object store. Object Store cũng có thể đặt tên được và bên trong phần DB có thể có nhiều thứ. Tóm lại thì Record được lưu ở trong Object Store, nhiều Object Store tập hợp lại với nhau thì tạo thành DB.
Thao tác với Database
sau đây thì chúng ta sẽ đi đến làm phần ví dụ về cách sử dụng của IndexedDB trong Javascript. Đối với IndexedDB có cả API đồng bộ và API bất đồng bộ vậy dưa từng ví dụ mình sẽ giải thích cho từng cái .
IDBRequest.
đầu tiên mình sẽ giới thiệu về Object IDBRequest. IDBRequest là 1 object dùng để biểu diễn kết quả của 1 thao tác nào được xảy ra trên IndexedDB. Thông qua object này ta có thể kiếm tra được xem là đã có event nào được phát sinh . có 2 loại event phát sinh trên ở trên IDBRequest đó là success và error, nếu thao tác thành công là success thất bại thì là error. đối với các thao tác ở trên IndexedDB thì sẽ có kết quả đi kèm . giả sử nếu mà chúng ta đọc dữ liệu từ DB thì phần dữ liệu đọc được sẽ là kết quả, khi mà đọc thành công thì có thể lấy được kết quả từ object IDBRequest. thưc sự thì kết quả sẽ được đưa vào phần result propepty. ở trong result property đó thì đương nhiên nó sẽ phụ thuộc vào thao tác mà chúng ta thực hiện. khi mà trường hợp đã yêu cầu 1 cái gì đó trên DB thì ngay lập tức chúng ta có thấy lấy được kết quả ngay trên IDBRequest object. tuy nhiên nếu nó là không đồng bộ thì sau khi lấy được IDBRequest thì vẫn chưa biết được kết quả. về cơ bản thì nên đăng kí handler event và chờ hoàn thành thao tác thì sẽ oke , nhưng mà trường hợp khi mà muốn biết được trạng thái của thao tác ở bên ngoài event thì làm như nào ?. Lúc đó chúng ta sẽ thấy tác dụng rất lớn của readyState của IDBRequest. nghe đến readyState thì chắc cũng ta chắc cũng nghe thấy nó rất là nhiều . về readyState thì có 2 loại đó là "pending" với pendding thì vẫn trong quá trình xử lí và kết quả thì chưa sử dụng được "done" với done thì đã hoàn tất xử lí và đương nhiên kết quả có thể sử dụng đươc. nhân đây thì mình nói luôn 1 sô property có thể sử dụng được đó là Error Property( rường hợp đã phát sinh lỗi và hoàn thành việc xử lí thì sẽ được đưa vào Error Property, thông thường thì hoàn thành sẽ là null.) , thêm vào đó thì source property cũng như là transaction property cũng có thể dùng được. mình sẽ nói rõ về nó ở phần sau.
Access vào DB
để access vào DB thì ta sẽ sử dụng window.indexDB không cần phải nói gì thêm nữa thì property của window là thuộc tính global . thuộc tính indexedDB property là 1 thể hiện của IDBFactory là một instance object. IDBFacetory có 3 method, đầu tiên thì mình sẽ giới thiệu trước 2 cái của nó. đó là phần open và deleteDatabase. thông qua tên gọi thì chúng ta có có thể biết luôn thì khi mà thao tác với DB thì đầu tiên đương nhiên chúng ta cần phải mở DB đó thì đó chính là ý nghĩa của open method và deleteDatabase method thì đương nhiên sẽ dùng để xoá DB. ở trên IDBRequest thì có thêm phần objectOpenDBRequest là kiểu object và thêm vào đó có thêm 2 event nữa đó là blocked và upgradeneeded event 2 event này thì mình sẽ giải thích sau. open method thì mang 2 biến đó là name DB, do DB có thể có nhiều DB nên cần phân biệt qua name của DB . và giá trị thứ 2 đó là name version version là 1 số nguyên lớn hơn 1. open là phương thức mở DB trong trường hợp mà DB đó không có tồn tại thì nó sẽ tự tạo cho mình DB, hay nói cách khác thì nếu cần sử dụng DB thì dùng method open. với biến thứ 2 đương nhiên nó sẽ chỉ định là version nào sẽ được mở lên. xong phần lí thuyết dài dòng ở phần sau mình sẽ viết tiếp phần đi vào thực tiễn h đi ăn cái đã . mình sẽ có gắng update sớm nhất có thể.(bow)
All rights reserved