离线访问 - SQLite 还是 Indexed DB?

31

我正在开发一个应用程序,处于研发阶段,有以下主要需求:

  • HTML5网络应用程序——还将提供混合版本
  • 当没有网络连接时,表单数据需要在本地存储

由于存储配额限制,我不能使用web storage——我正在比较SQLiteIndexed DB

  • SQLite似乎是最适合的选择,但已被弃用
  • Indexed DB是一个很好的替代方案,但没有Safari支持——一个混合应用程序应该在iPad上运行,并在未来在Android设备上运行。

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


我知道现在有点晚了,但是SQLite绝对没有被弃用,你只需要访问这个链接:http://www.sqlite.org/src/timeline?t=trunk&n=1000&a=release,如果你想要在所有现代浏览器中使用它,今天而不是明天,这是最好的选择。 - Klaus Villaca
2
@Klaus,我认为Taha所说的SQLite是WebSQL,这已经被废弃了。 - Saravana
8个回答

20

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

IndexedDB -

  • 它与许多移动操作系统不兼容,只与某些版本的移动操作系统兼容
  • 开发人员无法在IndexedDB中使用SQL。 他们可以使用SQLite和WebSQL
  • 大多数开发人员尽可能避免使用IndexedDB

WebSQL -

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

SQLite -

  • 它获得了Google的奖励
  • SQLite有其官方网站。 IndexedDB和WebSQL没有
  • 在Google上,SQLite返回4.3百万个结果。 WebSQL返回少于700K个结果,而IndexedDB返回282K个结果。

如果您想快速学习SQLite,请

使用Android和Phonegap存储SQLite数据库


1
如果我没错的话,没有浏览器直接支持SQLite,因为WebSQL是使用它的HTML功能。 如果您查看HTML5的存储选项,您主要有键值、indexedDB和WebSQL(left for popularity reasons)。 https://html5test.com 对于任何其他选项,您都需要一些插件... - Andrew
1
截至今天,谷歌搜索WebSQL返回390K,Indexed Db返回200万,SQLite返回1300万。实质上,由于被弃用,WebSQL肯定走到了尽头。 - RBT

18

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

似乎有各种JavaScript解决方案来弥合这两者之间的差距——在用户浏览器可用的任一项中保存: JavaScript库桥接IndexedDB和WebSQL 我认为这可能是您最好的解决方案。


谢谢您的回复。是的,我指的是WebSQL。 - Taha
10
不过要小心。虽然 WebSQL 在一些桌面浏览器中不被支持,但与 IndexedDB 相比,在移动设备上得到了更好的支持。请查看 caniuse.com 获取更多详情。 - Raymond Camden
上面的URL讨论了persistence.js - 在最初的谷歌搜索中,我发现它不能与IndexedDB一起使用。你对此有什么了解吗? - Taha
很抱歉,我不知道。但是,如果你在那个问题下面继续往下看,会有一个包含大约20种不同持久化选项的答案。你应该试着看一下其中几个,直到找到你喜欢的为止。 - Robin Winslow
1
老实说,我非常讨厌IndexedDB。它太可怕了,而且使用它很恶心。我开始用它开发一个应用程序,但我打算无论后果如何都要切换回WebSQL。 - Manachi

6

是的,IndexedDB API非常好,所有浏览器都将在不久的将来支持。

我强烈推荐我的解决方案https://bitbucket.org/ytkyaw/ydn-db,它是一个非常薄的IndexedDB包装器,并且可以在Safari中回退到Sqlite。


3
IndexedDB很可能是未来支持的数据库,与WebSQL相比最好选择它。正如Raymond所指出的那样,最好参考http://www.caniuse.com查看桌面和移动浏览器中当前/未来的支持情况。
根据您解决方案当前的需求,您可能可以使用许多可用的JavaScript库之一,这些库使用本地存储并提供查询接口。其中一个对我很好用的库是Lawnchair

3
如果您不想在IndexedDB和WebSQL之间做出选择,可以使用JavaScript库PouchDB。我在Android Webview中使用它来存储离线数据,效果非常好。如果没有可用的互联网连接,数据将存储在本地数据库(使用IndexedDB或WebSQL),并在有可用连接时与远程数据库(CouchDB数据库)同步。PouchDB将依赖于IndexedDB,但如果不支持IndexedDB,则退回到WebSQL。还可以使用Cordova/PhoneGap的SQLite插件。

2
我想对这个问题进行一些小的编辑,因为谷歌将我们引导到这个问题,如果你在websql、localStorage和indexedDB的主题上进行研究。但是我的编辑被拒绝了,所以我将其发布为一个答案。
正如其他人在他们的回答中所述,IndexedDB 在支持和网络文档方面有些欠缺。
但是IndexedDB的支持已经得到了极大的提高,特别是在移动端。它的支持已经得到了很大的改善,唯一没有支持或者几乎没有支持的浏览器是Opera Mini,但它只占市场使用率的0.34%
截至2015年,我建议任何开发者转向使用IndexedDB,因为WebSQL已被弃用,IE和Firefox停止支持它(这仅占市场使用率的15%以上!),而SQLite正在迅速失去市场份额,而IndexedDB则拥有非常好的文档来源(documentation sources)、很多的资源(many)以及一些官方支持(Some official as well)。甚至有一些IT公司也在鼓励使用,比如IBM
我将使用它,并且到目前为止还没有遇到任何问题。Safari已经添加了对它的支持,所有主要浏览器也都支持。大胆尝试吧!
编辑:个人附言:我尝试了IndexedDB。作为团队的高级成员,IndexedDB的语法对于小型存储问题来说过于混乱和复杂 - 我最终使用localstorage来保存一些简单的JSON数据,并在需要时解析它。这样对于我们团队中的任何人都更好理解(当然也包括我自己!)

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由这个家伙维护 :)。

1

这可能有点晚了,但你可以看看:SequelSphere

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

虽然它目前仅支持localStorage,但想法是支持未来的所有标准。随着浏览器支持其他类型的持久性,SequelSphere将利用它们。积极的一面是,您只需使用标准SQL编写代码,并让它处理持久性。

尽管如此,请注意它是市场上的新产品,因此既有积极的一面也有消极的一面。


谢谢您的建议 - 但由于localStorage的存储限制,这个选项似乎不可行。 - Taha
很好的观点。未来(在一个月或两个月内),SequelSphere将支持将其数据存储到indexedDB,但目前还不支持。作为免责声明:我与SequelSphere有关联。 - John Fowler
这个网站似乎已经不存在了。 - Tony O'Hagan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接