JavaScript库用于连接IndexedDB和WebSQL

18

我想知道是否有一个库或项目,可以根据用户浏览器的支持情况,提供通用的IndexedDB或WebSQL接口。如果使用Chrome/Safari,则使用WebSQL;如果使用Firefox或Internet Explorer,则使用IndexedDB。

这个问题的发帖人似乎自己开发了一个解决方案,但没有提供任何源代码。这里是问题链接。

6个回答

16

JasonCasden在他的演示文稿“浏览器储存和我”中分享了一个巨大的库/包装列表。以下是该列表:

lawnchair
persistence.js
persistJS
amplify.store
localStorageDB
https://github.com/axemclion/IndexedDB
realStorage
YUI3 CacheOffline
dojox.storage
DomSQL
Impel
ActiveJS ActiveRecord
JazzRecord
picnet.data.DataManager
ShinyCar
lscache
Kizzy
Artemia
microcache.js
Store.js

9

有没有关于picnet的文档?它似乎是某个更大框架的一部分? - Andreas Gohr
persistance.js似乎有很多用户。它是最好的吗? - Arun Prasad E S

8
我已经为此编写了 YDN-DB,它是一个基于 closure 库的数据库包装器,支持 IndexedDB、WebSql 和 localStorage。

目标

创建美观易用的 API,用于安全、强大、高性能和大规模的 Web 应用程序。

特点

  • 支持 IndexedDB、Web SQL 和 localStorage 存储机制。
  • 经过充分测试的 closure 库模块。
  • 支持版本迁移、加密、查询事务
  • 每个方法调用都是一个原子事务。所有方法都是异步的。
  • 遵循通常的 JavaScript 规范,如:单一命名空间、无全局变量、不进行错误捕获(除非在文档中告知),不使用 eval、参数化查询、this 是 this、编码错误会抛出异常。
  • 提供 JQuery 插件(请参见下载部分)。

基本用法

将最新的压缩 JS 脚本(请参见下载部分)导入到您的 HTML 文件中。这将在全局作用域中创建一个对象,调用 ydn.db.Storage。

var db = new ydn.db.Storage('db name');

db.setItem('x', 'some value')

db.getItem('x').success(function(value) {
  console.log('x = ' + value);
}

查询

使用查询计算平均值

q = db.query('customer').average('age');
avg = q.fetch()

关键查询

q = db.query('customer', 'age').bound(18, 25, true).where('sex', '=', 'FEMALE').select('full_name')
young_girl_names = q.fetch()

交易

p1 = db.key('player', 1);
db.transaction(function() {
   p1.get().success(function(p1_obj) {
        p1_obj.health += 10;
        p1.put(p123_obj);
   });
}, [p1]);

加密

可以选择使用SHA-1密码对字符串值数据进行加密。

db = new ydn.db.Store('store name')
db.setSecret(passphase); // generally send from server side upon login
db.setItem(key, value, 3600*1000); // data expire on one hour
db.getItem(key); // data will be decrypted using the provided passphase

只是想让你知道,我已经尝试了几乎所有的方法来从存储中获取或检索一个项目,但它们都失败了,显示未定义。 - Aman Virk
真的吗?我很努力地尝试使用这个库使其更容易。你在目标浏览器上运行了单元测试http://dev.yathit.com/test/test_qunit.html吗?你读过http://dev.yathit.com/ydn-db/getting-started.html吗? - Kyaw Tun

7
请看这个:https://github.com/axemclion/IndexedDBShim
它是一种通过 WebSql 实现 IndexedDB 功能的 polyfill。我使用它,认为它非常好用。但像其他解决方案一样,它也有一些限制,不过你几乎可以自由开发而不会遇到大问题。

7
问题已经得到解答,我只是想分享一些更新内容。
2012年5月,发布了JayData,这是JavaScript的统一数据访问库,可帮助管理IndexedDB、WebSQL、SQLite、MongoDB、HTML5 localStorage数据库和Facebook、OData、WebAPI、YQL数据服务,并使用相同的JavaScript语言查询语法。从WebSQL更改为IndexedDB仅意味着更改存储提供程序的类型:
var todoDB = new TodoDatabase({ 
    provider: 'webSql', databaseName: 'MyTodoDatabase' });

var todoDB = new TodoDatabase({ 
    provider: 'indexedDB', databaseName: 'MyTodoDatabase' });

如果您不指定提供程序,该库将按以下优先顺序检测浏览器/设备的可用存储(WebSQL、IndexedDB、HTML5 localStorage)。
免责声明:我是开源JayData项目的开发团队成员。

1
我希望您(OP)对已接受答案中提出的解决方案感到满意。对于那些仍在寻找可靠解决方案的人(这个群体可能包括或不包括OP),请查看BakedGoods
它是一个库,建立了一个统一的接口,可以用来在所有本地和一些非本地客户端存储设施中进行存储操作。它还保持了每个用户所提供的灵活性和选项。
使用它,在支持的数据库类型中进行存储操作只需要指定适当的操作选项和等效的配置即可:
//If the operation is a set(), and the referenced structures 
//don't exist, they will be created automatically.

var webSQLOptionsObj = {
    databaseName: "Example_DB",
    databaseDisplayName: "Example DB",
    databaseVersion: "",
    estimatedDatabaseSize: 1024 * 1024,
    tableData: {
        name: "Main",
        keyColumnName: "lastName",
        columnDefinitions: "(lastName TEXT PRIMARY KEY, firstName TEXT)"
    }, 
    tableIndexDataArray: [name: "First_Name_Index", columnNames: "(firstName)"]
};

var indexedDBOptionsObj = {
    databaseName: "Example_DB",
    databaseVersion: 1,
    objectStoreData: {
        name: "Main",
        keyPath: lastName,
        autoIncrement: false
    },
    objectStoreIndexDataArray: [
        {name: "First_Name_Index", keyPath: "firstName", unique: false, multiEntry: false}
    ],
};

var optionsObj = {
    conductDisjointly: false, 
    webSQL: webSQLOptionsObj, 
    indexedDB: indexedDBOptionsObj
};

...并执行该操作:

bakedGoods.set({
    data: [
        {value: {lastName: "Obama", firstName: "Barack"}}, 
        {value: {lastName: "Biden", firstName: "Joe"}}
    ],
    storageTypes: ["indexedDB", "webSQL"],
    options: optionsObj,
    complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){}
});

它简单的界面和无与伦比的存储设施支持,但缺乏对某些存储设施特定配置的支持。例如,它不支持在具有多列主键的WebSQL表中进行存储操作。

因此,如果您经常使用这些类型的功能,您可能需要寻找其他解决方案。

哦,为了完全透明,BakedGoods是由我亲自维护的 :)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接