IndexedDB的包装器函数
Wrapper functions for IndexedDB
我需要为iPad/平板设备构建一个离线HTML5 web应用程序,用户可以从服务器下载数据集(数据表)并将其存储在设备上。然后,用户可以断开与服务器的连接,并在设备上本地查看/编辑数据。这是为那些在偏远地区工作的人准备的,那里没有蜂窝网络覆盖,需要收集/更新数据。当他们回到办公室时,他们可以同步/上传数据回服务器。它之所以需要HTML5是因为它与平台无关,即只要它拥有支持HTML5的现代网页浏览器,就可以在iOS, Android等平台上运行。
现在我已经使用HTML5本地存储(用于数据)和HTML5离线应用程序缓存(用于页面/css/js/图像)构建了系统,它与小数据集一起工作得相当好(我可以在离线时查看,编辑和保存,在线时加载/同步)。现在我需要扩展到10,000行数据。它可以工作,但速度很慢,在英特尔四核8GB机器上加载时,浏览器会挂起10秒。
所以我一直在研究一些比本地存储更好的选择:
1) WebSQL:将能够使用SQL语言查询数据,并进行连接等。问题是它现在已经被弃用了,不会再被支持了,所以我不想花时间为它做什么。
2) IndexedDB:使用对象存储(从技术上讲,我已经使用本地存储API存储对象并使用JSON存储)。可能更快,因为它使用SQL lite后端索引。有很多样板代码可以完成简单的任务,比如创建数据库、添加数据库、读取数据库、遍历数据库。我只是想做一个简单的查询,如select(xyc, abc).where(abc = 123).limit(20)
,而不是写了很多JavaScript代码来做它。如何编写自己的代码来进行表之间的连接,有例子吗?
我发现了一个jQuery插件,可能会使生活更简单。有没有其他的库可以减轻使用IndexedDB的痛苦?
多谢!
我有一个支持IndexedDB和WebSql的开源web数据库包装器。
版本迁移是在后台处理的。下面的代码迁移(或初始化)到版本2。
schema_ver2 = {
version: 2,
size: 2 * 1024 * 1024, // 2 MB
stores: [{
name: 'ydn_obj',
keyPath: 'id.value',
indexes: [{
name: 'age',
type: 'INTEGER' // type is require for WebSql
}]
}]
}
db = new ydn.db.Storage('db name', schema_ver2)
Query非常灵活和强大。例如:
q = db.query('customer').when('age', '>=', 18 , '<', 25).where('sex', '=', 'FEMALE')
young_girls = q.fetch(10, 2); // limit and offset
如果age被索引了,那么再次使用更有效的键范围查询:
q = db.query('customer', 'age').bound(18, 25, true).where('sex', '=', 'FEMALE')
还支持事务处理
p123 = db.tkey('player', 123);
db.runInTransaction(function() {
p123.get().success(function(p123_obj) {
p123_obj.health += 10;
p123.put(p123_obj);
});
}, [p123]);
试试linq2indexeddb。它有你想要的查询接口+ indexeddb shim for websql, websql API也支持。
你考虑过[Lawnchair][1]吗?它从底层存储中提供了一个很好的抽象,还有用于查询、聚合和分页数据的插件。作为查询的示例:
// basic searching
this.where('record.name === "brian"', 'console.log(records)')
this.where('record.name != ?', username, 'console.log(records)')
// sorting results
this.where('name === "brian"').asc('active', 'console.log(records)')
我能看到的唯一潜在的缺点是,它似乎不处理迁移和通用似乎没有办法创建索引等。
关于连接,IndexedDB被设计成面向文档(非SQL)存储而不是关系数据库,但是考虑到这是一个常见的场景,似乎有两个选项:
1)游标遍历数据项2)如果上面的方法太慢,你也可以创建一个专用的键值对象存储,然后可以使用它在相关存储中进行索引查找。根据您拥有的连接需求的数量,这可能是一件麻烦事。
我认为JsStore会适合你。
让我们假设你的查询看起来像这样在sql -
select * from table_name where column1='abc' limit 20
在JsStore -它将是
var Connection = new JsStore.Instance("YourDbName");
Connection.select({
From: "table_name"
Where: {
Column1: 'abc',
},
Limit:20,
OnSuccess:function (results){
console.log(results);
},
OnError:function (error) {
console.log(error);
}
});
所以你可以使用JsStore编写类似sql的查询
- 如何将函数包装在函数中以避免代码重复
- 尽管函数包装,但值在循环中未闭合
- 将同步函数包装到承诺中的最佳方法是什么?
- 计算三角形面积-作为变量工作,但不作为函数包装
- 如何将回调函数包装在其他回调函数中并从中调用
- 我可以在这个例子中立即调用我的函数,而不是通过匿名函数包装它吗?
- 使用自执行函数包装命名空间
- 有人可以在 JavaScript 中解释这种函数包装语法吗?
- 使用 Jasmine 测试 JavaScript 函数包装在 jQuery 中
- 将全局函数包装在 (function($){ }(jQuery) 中
- 如何将纯函数包装到构造函数中
- 为什么这个由Typescript生成的JavaScript构造函数包装了一个立即调用的函数
- 将方法名称作为回调传递VS.用烦人的函数包装它
- 为什么函数包装不隐藏javascript中未调用的函数对象
- 什么'匿名函数包装器和javascript中的新函数包装器之间的区别
- 如何将EasleJS库中的MouseEvent构造函数包装在GWT中?
- chrome.tab .create函数包装器,为什么不工作
- 将在其他地方定义的异步函数包装在回调中
- 为什么有两种不同的角函数包装方法,哪一种最好?
- 是否有一种方法可以将jquery函数包装到对象中?