离线访问 - SQLite 或索引数据库?
Posted
技术标签:
【中文标题】离线访问 - SQLite 或索引数据库?【英文标题】:Offline access - SQLite or Indexed DB? 【发布时间】:2012-08-28 03:54:06 【问题描述】:我正处于开发应用程序的研发阶段,具有以下关键要求:
html5 web application - 也将有一个混合版本 当没有 Internet 连接时,表单数据将存储在本地由于配额限制,我无法使用网络存储 - 我正在比较 SQLite 和 Indexed DB。
SQLite 似乎最合适,但已弃用 索引数据库是一个不错的选择,但不支持 Safari - 未来应该在 iPad 和 android 设备上运行混合应用程序。我对 API 的选择感到困惑。在 Safari 上是否有其他 SQLite 替代方案或对 Indexed DB 的支持?
【问题讨论】:
我知道这有点晚了,虽然 SQLite 它绝对没有被弃用,只是你去这个链接:sqlite.org/src/timeline?t=trunk&n=1000&a=release 如果你想让它在今天而不是明天在所有实际浏览器中工作这是最好的选择。 @Klaus 我认为 Taha 所说的 SQLite 是 WebSQL,它肯定已被弃用。 【参考方案1】:我认为放弃 IndexedDB 是个坏主意,因为它可能是未来的格式,所以 Safari 可能会停止支持 WebSQL。
似乎有各种 javascript 解决方案可以弥补两者之间的差距 - 保存在用户浏览器上可用的任何一个中: JavaScript Library to Bridge IndexedDB and WebSQL 我认为这可能是您最好的解决方案。
【讨论】:
感谢您的回复。是的,我指的是 WebSQL。 不过要小心。虽然某些桌面浏览器不支持 WebSQL,但与 IndexedDB 相比,它对移动设备的支持好多。查看 caniuse.com 了解更多详情。 上面的 URL 谈到了 persistence.js - 在最初的谷歌搜索中,我发现它不能与 IndexedDB 一起使用。你有这方面的知识吗? 我不怕。但是,如果您进一步看这个问题,就会有大约 20 种不同的持久性选项的答案。你应该只看几个,直到找到你喜欢的。 老实说,我对 IndexedDB 充满热情。这太可怕了,和它一起工作简直令人作呕。我用它启动了一个应用程序,我将切换回 WebSQL - 不管后果如何。【参考方案2】:首先,被 W3C 弃用的是 WebSQL 而不是 SQLite
索引数据库 -
它与许多类型的移动操作系统不兼容,仅与某些类型的移动操作系统版本兼容 开发人员不能将 SQL 与 IndexedDB 一起使用。他们可以使用 SQLite 和 WebSQL 大多数开发人员都尽量避免使用 IndexedDBWebSQL -
它已被 W3C 弃用,这意味着它不再被维护或开发 它需要另一个名为 Polyfill 的插件才能使移动应用程序能够与流行的移动操作系统(例如 Google Android 和 Apple ios)一起使用SQLite -
它获得了谷歌的奖项 SQLite 有它的官方网站。 IndexedDB 和 WebSQL 没有 在 Google 上,SQLite 返回 430 万条结果。 WebSQL 返回的结果略少于 700K,IndexedDB 返回的结果为 282K。如果你想要一个关于 SQLite 的快速教程,
Storage of SQLite database using Android and Phonegap
【讨论】:
如果我没记错的话,没有浏览器直接支持 SQLite,因为 WebSQL 是使用它的 HTML 特性。如果你检查 HTML5 的存储选项,你主要有 key-value、indexedDB 和 WebSQL(出于流行原因而留下)。 html5test.com 对于任何其他选项,您都需要一些插件... 截至今天,谷歌搜索 WebSQL 返回 390K,Indexed Db - 200 万和 SQLite - 1300 万。从本质上讲,WebSQL 肯定会因为它被弃用而走向死胡同。【参考方案3】:是的,IndexedDB API 很棒,所有浏览器都将在不久的将来支持。
我绝对推荐我自己的解决方案https://bitbucket.org/ytkyaw/ydn-db,它是 IndexedDB 的非常薄的包装器,并且在 safari 中回退到 Sqlite。
【讨论】:
【参考方案4】:IndexedDB 很可能是未来受支持的数据库,最好使用它而不是 WebSQL。正如 Raymond 指出的那样,最好参考 http://www.caniuse.com 以了解桌面和移动浏览器当前/未来的支持。
根据您的解决方案的当前需求,您可以选择使用 local storage 并提供查询接口的众多可用 JavaScript 库之一。 Lawnchair 是其中一个对我很有效的库。
【讨论】:
【参考方案5】:如果您不想在 IndexedDB 或 WebSQL 之间进行选择,您可以使用 Javascript 库 PouchDB。
我在 Android Webview 中使用它来存储离线数据,它工作得很好。如果没有可用的 Internet 连接,数据将存储在本地数据库(使用 IndexedDB 或 WebSQL)中,并在有可用连接时与远程数据库(CouchDB 数据库)同步。
PouchDB 将依赖于 IndexedDB,但 fall back to WebSQL 如果不支持 IndexedDB。也可以为 Cordova/PhoneGap 使用 SQLite 插件。
【讨论】:
【参考方案6】:我想做一个小的编辑来更新这个问题,因为如果你对 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 sources、many。 Some official as well!。一些 IT 公司甚至也在鼓励使用,例如 IBM。
我打算用它,到目前为止我还没有遇到任何问题。 Safari 已经增加了对它的支持,所有主要的浏览器也是如此。加油!
编辑:个人附录:我试过 IndexedDB。我是团队中的一名资深人士,IndexedDB 语法对于小的存储问题来说太混乱和复杂了——我最终使用 localstorage 来保存一些简单的 JSON 数据并在需要时对其进行解析。我团队中的任何人都可以更好地获得它(当然,我也是!)
【讨论】:
【参考方案7】:这可能有点晚了,但你可以看看:SequelSphere
它是一个 100% 的 HTML5/JavaScript 关系数据库,可以跨浏览器工作,并使用本地存储来保存其数据。您也可以使用 SQL 来查询它。它是它自己的数据库引擎,不依赖于内置的(WebSQL)关系数据库。因此,它适用于所有浏览器。
虽然它目前仅支持 localStorage,但其想法是支持未来的所有标准。由于浏览器支持其他类型的持久性,SequelSphere 将利用这一点。积极的一面是,您只需使用标准 SQL 对 SequelSphere 进行编码,并让它处理持久性。
不过,请注意,它是市场上的新产品,因此既有积极的一面,也有消极的一面。
【讨论】:
感谢您的建议 - 但由于 localStorage 的存储限制,此选项似乎不可行。 好点。在未来(一两个月内),SequelSphere 将支持将其数据存储到 indexedDB,但它还没有这样做。作为免责声明:我已连接到 SequelSphere。 这个网站似乎不存在了。【参考方案8】:正如其他人指出的那样,由于已经提出了这个问题,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 由这个人在这里维护 :)。
【讨论】:
以上是关于离线访问 - SQLite 或索引数据库?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在 iPhone 的离线 openstreetmaps sqlite 地图瓦片数据库上实现离线地理编码?
SQLite 和 Firebase 数据库之间的同步,当用户离线数据存储在 sqlite 和在线数据存储在 firebase 时