我需要为iPad /平板电脑设备构建一个离线HTML5网络应用,用户可以从服务器下载数据集(数据表)并将其存储在设备上。然后,用户可以断开与服务器的连接,并在设备上本地查看/编辑数据。这适用于在没有蜂窝覆盖且需要收集/更新数据的偏远地区工作的人。当他们回到办公室时,他们可以将数据同步/上传回服务器。它需要成为HTML5的原因是它与平台无关,即只要它有一个支持HTML5的现代网络浏览器,就可以在iOS,Android等上运行它。
现在我已经使用HTML5本地存储(用于数据)和HTML5离线应用程序缓存(用于pages / css / js / images)构建了系统,并且它可以很好地处理小数据集(我可以查看,离线时编辑和保存,在线加载/同步)。现在我需要扩展到10,000行数据。它工作正常但速度非常慢,并且在加载到Intel四核8GB机器上时将浏览器挂起10秒。
所以我一直在研究一些比本地存储更好的替代方案:
1)WebSQL:能够使用SQL语言查询数据并进行连接等问题是它现在已被弃用,不再支持了,所以我不想花时间为它构建一些东西。 / p>
2)IndexedDB:使用对象存储(从技术上讲,我已经使用本地存储API存储对象并使用JSON存储)。由于它使用带有SQL lite后端的索引,因此可能更快。有许多样板代码可用于执行简单的任务,例如创建数据库,添加数据库,读取数据库,迭代数据库。我只是想做一个像select(xyc, abc).where(abc = 123).limit(20)
这样的简单查询,但是必须编写很多JavaScript代码来完成它。如何编写自己的代码来在表之间进行连接,任何地方的任何示例?
我发现了一个jQuery plugin可能会让生活更简单。是否有其他库或其他库可以减轻使用IndexedDB的痛苦?
非常感谢!
答案 0 :(得分:4)
我有一个支持IndexedDB和WebSql的开源web database wrapper。
版本迁移是在感觉背后处理的。以下代码将(或初始化)迁移到版本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
如果索引年龄,则再次使用更有效的键范围查询:
q = db.query('customer', 'age').bound(18, 25, true).where('sex', '=', 'FEMALE')
它也支持transaction。
p123 = db.tkey('player', 123);
db.runInTransaction(function() {
p123.get().success(function(p123_obj) {
p123_obj.health += 10;
p123.put(p123_obj);
});
}, [p123]);
答案 1 :(得分:3)
试试linq2indexeddb。它具有您想要的查询接口+ indexeddb shim for websql也支持WebSQL API。
答案 2 :(得分:1)
您是否考虑过[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被设计为面向文档(No SQL)存储而不是关系数据库,但是鉴于这是一种常见的情况,它有两种选择:
1)Cursor迭代数据项 2)如果上述速度太慢,您还可以创建一个专用的键值对象存储库,然后可以使用该存储库在相关商店中进行索引查找。根据您的加入要求数量,这可能是一件苦差事。
答案 3 :(得分:0)
我认为JsStore会为你效劳。
让我们说你的查询在sql中看起来像这样 -
从table_name中选择*,其中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。