【问题标题】:JavaScript Library to Bridge IndexedDB and WebSQL连接 IndexedDB 和 WebSQL 的 JavaScript 库
【发布时间】:2011-09-01 05:51:18
【问题描述】:

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

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

【问题讨论】:

    标签: javascript web-sql indexeddb


    【解决方案1】:

    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
    

    【讨论】:

      【解决方案2】:

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

      要么这样,要么使用他的picnet.data.DataManager 解决方案。

      也可以看看persistence.js

      【讨论】:

      • 在某处是否有一些关于 picnet 的文档?它似乎是某个更大框架的一部分?
      • persistance.js 似乎有很多用户。是最好的吗
      【解决方案3】:

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

      目标

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

      特点

      • 支持 IndexedDB、Web SQL 和 localStorage 存储机制。
      • 经过良好测试的闭包库模块。
      • 支持版本迁移、加密、querytransaction
      • 每个方法调用都是一个原子事务。所有方法都是异步的。
      • 遵循常见的 javascript 礼仪,例如:单一命名空间、没有全局、没有错误通配(除非我们在文档中告诉您)、没有 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
      

      【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        问题已回答,我只想分享更新。

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

        【讨论】:

          【解决方案6】:

          我希望您 (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 确实由您维护 :)。

          【讨论】:

            猜你喜欢
            • 2011-03-10
            • 2012-04-19
            • 2017-05-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-03-07
            • 2014-09-10
            • 2016-07-30
            相关资源
            最近更新 更多