离线访问 - SQLite还是索引数据库?

时间:2012-09-03 11:55:10

标签: html5 sqlite local-storage indexeddb

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

  • HTML5 web application - 也将有混合版本
  • 当没有互联网连接时,表格数据将存储在本地

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

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

我对API的选择感到困惑。在Safari上是否还有其他SQLite替代方案或支持索引数据库?

8 个答案:

答案 0 :(得分:14)

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

似乎有各种JavaScript解决方案来弥合两者之间的差距 - 在用户的浏览器上可用的任何一个节省: JavaScript Library to Bridge IndexedDB and WebSQL 我认为这可能是你最好的解决方案。

答案 1 :(得分:13)

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

IndexedDB -

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

WebSQL -

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

SQLite -

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

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

Storage of SQLite database using Android and Phonegap

答案 2 :(得分:5)

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

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

答案 3 :(得分:3)

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

根据您的解决方案的当前需求,您可以使用许多使用local storage并提供查询界面的JavaScript库中的一个。其中一个适合我的图书馆是Lawnchair

答案 4 :(得分:2)

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

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

如果不支持IndexedDB,PouchDB将依赖于IndexedDB但fall back to WebSQL。还可以为Cordova / PhoneGap使用SQLite插件。

答案 5 :(得分:2)

我想做一个小编辑来更新这个问题,因为如果您对websql,localStorage和indexedDB这个主题进行研究,谷歌会指导我们这个问题。编辑被拒绝了,所以我发帖作为答案。

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

但IndexedDB支持已vastly improved for mobile。它改进了很多,唯一没有任何支持的浏览器是Opera Mini,but it has only 0,34% of market usage

截至2015年,我建议任何开发人员迁移到IndexedDB,因为WebSQL已被弃用,IE和Firefox停止支持它(仅这些就超过市场使用量的15%!)而且SQLite正迅速失去空间IndexedDB,现在非常好documentation sourcesmanySome official as well!一些IT公司甚至也在激励使用,例如IBM

我打算用它,到目前为止我还没有遇到任何问题。 Safari增加了对它以及所有主流浏览器的支持。去吧!

编辑:个人附录:我尝试过IndexedDB。我是团队中的高级管理员,而IndexedDB语法对于小型存储问题来说太杂乱和复杂 - 我最后使用localstorage来保存一些简单的JSON数据并在需要时解析它。我团队中的任何人都可以更好地获得它(当然,我也是如此!)

答案 6 :(得分:1)

这可能是游戏的后期,但您可以查看:SequelSphere

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

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

尽管如此,请注意它是市场上的新产品,因此既有正面也有负面效果。

答案 7 :(得分:1)

正如其他人所指出的,因为这个问题已被提出,webSQL has been deprecated,而IndexedDB实现now exist in all of the major browser vendors

所以对于那些可能发现自己面临相同决策的人来说,请使用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由这个人维护在这里:)。