17

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

这个问题的发布者似乎有自己的解决方案,但没有提供任何源代码。

4

6 回答 6

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
于 2012-03-19T10:28:23.133 回答
9

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

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

还要看看persistence.js

于 2011-06-09T15:20:26.480 回答
8

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

目标

美丽的 API,用于安全、强大的高性能大型 Web 应用程序。

特征

  • 支持 IndexedDB、Web SQL 和 localStorage 存储机制。
  • 经过良好测试的闭包库模块。
  • 支持版本迁移、加密、查询交易
  • 每个方法调用都是一个原子事务。所有方法都是异步的。
  • 遵循通常的 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
于 2012-08-09T10:56:08.097 回答
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 项目开发团队的成员

于 2013-02-22T17:00:43.873 回答
7

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

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

于 2012-12-20T08:08:06.633 回答
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 由您真正维护 :) 。

于 2016-07-08T21:53:46.683 回答