根据您对iOS上Safari的给定要求,除了WebSQL,别无选择。WebSQL在Opera和Blackberry等其他移动浏览器中也受支持。我不认为他们会删除对WebSQL的支持,即使他们有IndexedDB。不知怎的,它们是互补的。
另一方面,在浏览器存储战争中,IndexedDB赢得了胜利。IE和FF将仅具有IndexedDB。具有讽刺意味的是,FF在Sqlite之上实现了IndexedDB。
我想说的是IndexedDB不仅仅是一个键值存储。它有索引和事务。仅这两者就提供了SQL查询的几乎所有功能,包括联接、条件查询和排序。由于它的异步API,一开始并不明显。
IndexedDB的性能优于WebSQL。它更安全。对于javascript用例来说,它更灵活。最后,它更易于使用。
为了说明这种情况,我将使用我的库,但您可以直接使用IndexedDB API:
人物商店有索引字段名称和列表索引字段爱好。在JSON中,
people = {
name: Foo Bar ,
email: foo@bar.com
hobby: [ camping , swimming ]
};
从爱好露营的人那里查到名字。
var req = db.keys( people , hobby , IDBKeyRange.only( camping ));
req.done(function(campers) {
db.keys( people , campers, name ).done(function(names) {
console.log(names);
});
});
这个代码的有趣之处在于它不涉及串行化。因此它非常快。
以下示例说明了友谊图查询友谊
对象存储只有一个列出的索引字段friend_list
。它使用人员对象存储密钥作为越界主键people
对象存储有许多属性,其中包括location
字段。该查询旨在查找认识me
和other_guy
并位于新加坡的朋友列表。
var q1 = new ydn.db.Iterator( friendship , friend_list , IDBKeyRange.only(me));
var q2 = new dn.db.Iterator( friendship , friend_list , IDBKeyRange.only(other_guy));
// if location is not indexed, a filtered value query is used.
var q3 = new ydn.db.Iterator( people , new ydn.db.Expression([ "location" , " Singapore ", = ]));
// if location is indexed, an index query is used.
// var q3 = new ydn.db.Iterator( people , location , IDBKeyRange.only( Singapore ));
var current_loop = 2; // start from inner loop
var join_algo = function(keys, index_keys) {
var advancement = [];
advancement[keys.length - 1] = null;
var has_adv = false;
for (var i = 0; i < keys.length; i++) {
if (!goog.isDef(keys[i])) {
// completed iterator
if (i != 0) {
advancement[i] = false; // request to restart the iteration
advancement[i - 1] = true; // advance outer iterator
current_loop = i - 1;
} // i == 0 means we are done.
has_adv = true;
break;
}
}
if (!has_adv) {
// continue looping current
advancement[current_loop] = true;
}
return advancement;
}
var result = db.scan([q3, q1, q2], join_algo);
result.done(function(keys, index_keys, values) {
console.log(values); // should get desire list of friends
});
同样,这个联接查询只是密钥扫描,因此速度非常快。默认情况下,scan
使用排序合并算法来查找匹配的键,但这里显示了一个简单的嵌套循环连接算法。因此,表连接是可能的,但您必须对连接算法进行编码。但是,像Z字形合并这样的新算法比Sqlite更快,因为所有输入都经过排序,光标也可以前进,更重要的是,连接过程可以利用数据库中没有的外部知识。使用SQL时,联接操作是不透明的。
除此之外,IndexedDB还可以使用流和映射/减少处理等技术。