Indexed Database,也可簡稱為 IndexedDB(以前被稱作 WebSimpleDB),同樣是一個 Web 客戶端存儲結(jié)構(gòu)化數(shù)據(jù)的規(guī)范,在 2009 年由 Oracle 提出。
如果說 Web SQL Databae 在客戶端實(shí)現(xiàn)了 傳統(tǒng)的 SQL 數(shù)據(jù)庫操作,那么 Indexed Database 更類似于 NoSQL 的形式來操作數(shù)據(jù)庫 , 其中最重要的是 Indexed Database 不使用 SQL 作為查詢語言。
其數(shù)據(jù)存儲可以不需要固定的表格模式,也經(jīng)常會避免使用 SQL 的 JOIN 操作,并且一般具有水平可擴(kuò)展性。
目前 W3C 官方也把焦點(diǎn) 投到對 Indexed Database 規(guī)范的制定當(dāng)中來,而 Microsoft 和 Mozilla 是對這個規(guī)范重要的兩個推動者,F(xiàn)irefox 4 以上已經(jīng)部分實(shí)現(xiàn)了 Indexed DB API,并且 IE 10 中也將實(shí)現(xiàn) Indexed DB API。由于在手機(jī)等移動設(shè)備的瀏覽器中都沒有實(shí)現(xiàn) Indexed DB API,所以其還有一定的局限性,但這并不妨礙它作為未來的 HTML5 的焦點(diǎn)而存在。
request = indexedDB.open("DataModel");
request.onupgradeneeded = function() {
db = request.result;
var store = db.createObjectStore("meters", {keyPath: "id"});
store.createIndex("by_tag", "tag", {unique: true});
store.createIndex("by_name", "name");
};
request.onsuccess = function() {
db = request.result;
};
function save(dataModel){
var tx = db.transaction("meters", "readwrite");
var store = tx.objectStore("meters");
dataModel.each(function(data){
store.put({
id: data.getId(),
tag: data.getTag(),
name: data.getName(),
meterValue: data.a('meter.value'),
meterAngle: data.a('meter.angle'),
p3: data.p3(),
r3: data.r3(),
s3: data.s3()
});
});
tx.oncomplete = function() {
console.log(dataModel.size() + ' datas are saved');
};
return dataModel.serialize();
}
function restore(dataModel){
var tx = db.transaction("meters", "readonly");
var store = tx.objectStore("meters");
var req = store.openCursor();
var nodes = [];
req.onsuccess = function() {
var res = req.result;
if(res){
var value = res.value;
var node = createNode();
node.setId(value.id);
node.setTag(value.tag);
node.setName(value.name);
node.a({
'meter.value': value.meterValue,
'meter.angle': value.meterAngle
});
node.p3(value.p3);
node.r3(value.r3);
node.s3(value.s3);
nodes.push(node);
res.continue();
}else{
if(nodes.length){
dataModel.clear();
nodes.forEach(function(node){
dataModel.add(node);
});
console.log(dataModel.size() + ' datas are restored');
}
}
};
return '';
}
function clear(){
var tx = db.transaction("meters", "readwrite");
var store = tx.objectStore("meters");
var req = store.openCursor();
var count = 0;
req.onsuccess = function(event) {
var res = event.target.result;
if(res){
store.delete(res.value.id);
res.continue();
count++;
}else{
console.log(count + ' datas are cleared');
}
};
}