首页 文章

用于桥接IndexedDB和WebSQL的JavaScript库

提问于
浏览
17

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

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

6 回答

  • 9

    您可能想要使用Lawnchair,这是众所周知的,正如Guido Tapia在您链接的问题中所提到的那样 .

    要么是,要么使用他的picnet.data.DataManager解决方案 .

    另外看看persistence.js .

  • 7

    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
    
  • 7

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

    目标

    美丽的API,用于安全可靠的高性能大型Web应用程序 .

    功能

    • 支持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
    
  • 15

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

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

  • 0

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

    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项目开发团队的成员

  • 8

    我希望你(OP)对你接受的答案中建议的解决方案感到满意 .

    对于仍在寻找有能力的解决方案的人(可能包括或不包括OP的组),请查看BakedGoods .

    它是一个库,它 Build 了一个统一的接口,可用于在所有本机和一些非本机客户端存储设施中进行存储操作 . 它还保持了每个人为用户提供的灵活性和选择 .

    有了它,在任何数据库类型的支持下进行存储操作都是......

    ...为两种数据库类型指定适当的操作选项和等效配置:

    //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由你的真正维护:) .

相关问题