用于桥接IndexedDB和WebSQL的JavaScript库

时间:2011-05-24 19:53:27

标签: javascript web-sql indexeddb

我很好奇是否有一个库或项目为IndexedDB或WebSQL提供通用接口,具体取决于用户的浏览器支持。如果他们使用Chrome / Safari,请使用WebSQL,如果他们使用的是Firefox或Internet Explorer,请使用IndexedDB。

this question的海报似乎有自己开发的解决方案,但没有提供任何源代码。

6 个答案:

答案 0 :(得分:15)

JasonCasden在他的演讲In-browser storage and me上分享了大量的库/包装器。这是清单:

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

答案 1 :(得分:9)

您可能希望使用Guido Tapia在您链接的问题中提及的Lawnchair,这是众所周知的。

或者使用他的picnet.data.DataManager解决方案。

另请查看persistence.js

答案 2 :(得分:8)

为了确切的目的,我写了YDN-DB。它是IndexedDB,WebSql和localStorage的数据库包装器,构建在闭包库的顶部。

目标

用于安全健壮的高性能大型网络应用的漂亮API。

功能

  • 支持IndexedDB,Web SQL和localStorage存储机制。
  • 经过良好测试的闭包库模块。
  • 支持版本迁移,加密,querytransaction
  • 每个方法调用都是一个原子事务。所有方法都是异步的。
  • 遵循通常的javascript礼节,例如:单个命名空间,没有全局,没有错误通配(除非我们在doc中告诉你),没有eval,参数化查询,这就是这个,编码错误抛出错误。
  • 提供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

答案 3 :(得分:7)

看看这个:https://github.com/axemclion/IndexedDBShim

使用WebSql启用IndexedDB是一个polyfill。我使用它并且我认为它非常好,但是作为每个解决方案,它都有一些限制,尽管你几乎可以随意开发它而没有大问题。

答案 4 :(得分:7)

问题得到解答,我只想分享更新。

2012年5月JayData已发布,这是JavaScript的统一数据访问库,有助于管理IndexedDB,WebSQL,SQLite,MongoDB,HTML5 localStorage数据库和Facebook,OData,WebAPI,YQL数据中的数据具有相同JavaScript Language Query syntax的服务。

从WebSQL更改为IndexedDB意味着只更改存储提供程序的类型:

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

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

如果您未指定提供程序,则库会按以下优先级顺序检测浏览器/设备的可用存储空间(WebSQL,IndexedDB,HTML5 localStorage)。

免责声明:我是开源JayData项目开发团队的成员

答案 5 :(得分:0)

我希望您(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真的由你自己维护:)。