28

我正处于开发应用程序的研发阶段,具有以下关键要求:

  • HTML5 Web 应用程序- 也将有一个混合版本
  • 当没有 Internet 连接时,表单数据将存储在本地

由于配额限制,我无法使用网络存储 - 我正在比较SQLiteIndexed DB

  • SQLite 似乎是最合适的,但它已被弃用
  • 索引数据库是一个不错的选择,但不支持Safari - 未来应该在 iPad 和 Android 设备上运行混合应用程序。

我对 API 的选择感到困惑。在 Safari 上是否有其他 SQLite 替代方案或对 Indexed DB 的支持?

4

8 回答 8

18

我认为放弃 IndexedDB 是个坏主意,因为它可能是未来的格式,所以 Safari 可能会停止支持 WebSQL。

似乎有各种 JavaScript 解决方案可以弥补两者之间的差距 - 保存在用户浏览器上可用的任何一个: JavaScript Library to Bridge IndexedDB 和 WebSQL 我认为这可能是您最好的解决方案。

于 2012-09-03T12:02:45.447 回答
16

首先,被 W3C 弃用的是 WebSQL 而不是 SQLite

索引数据库 -

  • 它与许多类型的移动操作系统不兼容,仅与某些类型的移动操作系统版本兼容
  • 开发人员不能将 SQL 与 IndexedDB 一起使用。他们可以使用 SQLite 和 WebSQL
  • 大多数开发人员都尽可能地避免使用 IndexedDB

WebSQL -

  • 它已被 W3C 弃用,这意味着它不再被维护或开发
  • 它需要另一个名为 Polyfill 的插件,以使移动应用程序能够与流行的移动操作系统(如 Google Android 和 Apple iOS)一起使用

SQLite -

  • 它获得了谷歌的奖项
  • SQLite 有它的官方网站。IndexedDB 和 WebSQL 没有
  • 在 Google 上,SQLite 返回 430 万条结果。WebSQL 返回的结果略少于 700K,IndexedDB 返回的结果为 282K。

如果你想要一个关于 SQLite 的快速教程,

使用 Android 和 Phonegap 存储 SQLite 数据库

于 2014-09-13T20:44:33.063 回答
6

是的,IndexedDB API 很棒,所有浏览器都将在不久的将来支持。

我绝对推荐我自己的解决方案https://bitbucket.org/ytkyaw/ydn-db它是 IndexedDB 的非常薄的包装器,并且回退到 Sqlite 用于 safari。

于 2012-09-03T14:43:17.930 回答
3

IndexedDB 很可能是未来受支持的数据库,最好使用它而不是 WebSQL。正如 Raymond 所指出的,最好参考http://www.caniuse.com以了解桌面和移动浏览器当前/未来的支持。

根据您的解决方案的当前需求,您可以使用许多可用的 JavaScript 库之一,这些库使用本地存储并提供查询接口。对我来说效果很好的图书馆之一是Lawnchair

于 2012-09-03T14:27:10.057 回答
2

如果您不想在 IndexedDB 或 WebSQL 之间进行选择,您可以使用 Javascript 库PouchDB

我在 Android Webview 中使用它来存储离线数据,并且效果很好。如果没有可用的 Internet 连接,数据将存储在本地数据库(使用 IndexedDB 或 WebSQL)上,并在有可用连接时与远程数据库(CouchDB数据库)同步。

PouchDB 将依赖于 IndexedDB,但如果不支持 IndexedDB,则回退到 WebSQL 。也可以为 Cordova/PhoneGap 使用 SQLite 插件。

于 2015-04-28T14:46:37.710 回答
2

我想做一个小的编辑来更新这个问题,因为如果你对 websql、localStorage 和 indexedDB 的主题进行研究,谷歌就会向我们提出这个问题。编辑被拒绝,所以我发布作为答案。

正如其他人在他们的回答中所说,IndexedDB 在支持和网络上的文档和规范方面缺乏一些内容。

但是对于移动端的 IndexedDB 支持已经有了很大的改进。它改进了很多,以至于唯一不支持或不支持的浏览器是 Opera Mini,但它只有 0,34% 的市场使用率

截至 2015 年,我建议任何开发人员迁移到 IndexedDB,因为 WebSQL 已被弃用,IE 和 Firefox 停止支持它(仅这些就占市场使用量的 15% 以上!)并且 SQLite 正在迅速失去空间给 IndexedDB,后者现在有非常好的文档来源很多一些官方以及!一些 IT 公司甚至也在鼓励使用,例如IBM

我打算使用它,到目前为止我还没有遇到任何问题。Safari 已经增加了对它的支持,所有主要的浏览器也是如此。去吧!

编辑:个人附录:我试过 IndexedDB。我是团队中的一名资深人士,IndexedDB 语法对于小的存储问题来说太混乱和复杂了——我最终使用 localstorage 来保存一些简单的 JSON 数据并在需要时对其进行解析。我团队中的任何人都可以更好地获得它(当然,我也是!)

于 2015-08-05T18:09:49.853 回答
1

这可能会迟到,但你可以看看: SequelSphere

它是一个 100% 的 HTML5/JavaScript 关系数据库,可以跨浏览器工作,并使用本地存储来保存数据。您也可以使用 SQL 来查询它。它是它自己的数据库引擎,不依赖于内置的(WebSQL)关系数据库。因此,它将适用于所有浏览器。

虽然它目前只支持 localStorage,但它的想法是支持所有未来的标准。由于浏览器支持其他类型的持久性,SequelSphere 将利用这一点。积极的一面是您只使用标准 SQL 针对 SequelSphere 进行编码,并让它处理持久性。

不过,请注意,它是市场上的新产品,因此既有正面的也有负面的。

于 2012-10-05T17:39:18.083 回答
1

正如其他人指出的那样,自从提出这个问题以来,webSQL已被弃用,而 IndexedDB 实现现在存在于所有主要浏览器供应商中。

因此,对于任何可能发现自己在这里面临同样决定的人来说,选择 IndexedDB。

这里的其他人也正确地暗示不必在两种类型的数据库之间做出选择。可以简单地选择(或制作)一个库,该库利用客户端计算机上可用的任何数据库。

如果您正在寻找这样的图书馆,请查看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-09T01:14:04.953 回答