Javascript IndexedDB的包装函数

Javascript IndexedDB的包装函数,javascript,jquery,local-storage,indexeddb,web-storage,Javascript,Jquery,Local Storage,Indexeddb,Web Storage,我需要为iPad/平板电脑设备构建一个离线HTML5Web应用程序,用户可以从服务器下载数据集(数据表)并将其存储在设备上。然后,用户可以断开与服务器的连接,并在设备上本地查看/编辑数据。这是为那些在没有手机覆盖的偏远地区工作并需要收集/更新数据的人设计的。当他们回到办公室时,他们可以将数据同步/上传回服务器。之所以需要HTML5,是因为它不依赖于平台,也就是说,只要它有支持HTML5的现代网络浏览器,就可以在iOS、Android等平台上运行 现在,我已经使用HTML5本地存储(用于数据)和H

我需要为iPad/平板电脑设备构建一个离线HTML5Web应用程序,用户可以从服务器下载数据集(数据表)并将其存储在设备上。然后,用户可以断开与服务器的连接,并在设备上本地查看/编辑数据。这是为那些在没有手机覆盖的偏远地区工作并需要收集/更新数据的人设计的。当他们回到办公室时,他们可以将数据同步/上传回服务器。之所以需要HTML5,是因为它不依赖于平台,也就是说,只要它有支持HTML5的现代网络浏览器,就可以在iOS、Android等平台上运行

现在,我已经使用HTML5本地存储(用于数据)和HTML5脱机应用程序缓存(用于页面/css/js/images)构建了该系统,它可以很好地处理小型数据集(我可以在脱机时查看、编辑和保存,在联机时加载/同步)。现在我需要扩展到10000行数据。它可以工作,但速度非常慢,在英特尔四核8GB机器上加载时会挂起浏览器10秒

因此,我一直在研究一些比本地存储更好的替代方案:

1) WebSQL:将能够使用SQL语言查询数据并进行连接等。问题是它现在已被弃用,不再受支持,所以我不想花时间为它构建一些东西

2) IndexedDB:使用对象存储(从技术上讲,我已经使用本地存储API和JSON存储了对象)。由于它使用SQL lite后端的索引,因此速度可能更快。有很多样板代码可以完成简单的任务,比如创建数据库、添加数据库、读取数据库、迭代数据库。我只想做一个简单的查询,比如
select(xyc,abc).where(abc=123).limit(20)
,但需要编写大量的JavaScript代码来完成。如何编写自己的代码来进行表之间的连接,任何地方都有这样的例子吗

我找到了一个可以让生活更简单的方法。有没有其他的工具或库可以减轻使用IndexedDB的痛苦


非常感谢

您考虑过[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) 如果上面的操作太慢,还可以创建一个专用的键值对象存储,然后可以使用它在相关存储中进行索引查找。根据您的加入需求的数量,这可能是一件麻烦事。

我有一个开源软件,它支持IndexedDB和WebSql

版本迁移在sense后面处理。以下代码将迁移(或初始化)到版本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)
它非常灵活和强大。例如:

q = db.query('customer').when('age', '>=', 18 , '<', 25).where('sex', '=', 'FEMALE')
young_girls = q.fetch(10, 2); // limit and offset
它还支持


试试看。它有您想要的查询接口,还支持WebSQL API。

我认为JsStore适合您

假设您的查询在sql中看起来像这样-

从表格名称中选择*列,其中列1='abc'限制20

在-它将是

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);
    }
});

因此,您可以使用编写类似sql的查询。

我相信WebSQL已经被放弃,取而代之的是IndexedDB……请注意WebSQL,Apple 5.0.1不再保存WebSQL数据。换句话说,这将破坏你的应用程序的本地数据库。Phonegap有一个解决办法。谢谢@Sidebp我已经看过了。默认情况下,它似乎支持本地存储。虽然我更喜欢默认情况下使用WebSQL,因为它的速度要快得多,但我认为没有改变适配器顺序的选项。WebSQL可以在2秒内查询200000行。IndexedDB需要15秒。本地存储在大约10000行之后挂起。
p123 = db.tkey('player', 123);
db.runInTransaction(function() {
   p123.get().success(function(p123_obj) {
        p123_obj.health += 10;
        p123.put(p123_obj);
   });
}, [p123]);
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);
    }
});