使用 Phonegap 和 iOS 5.1 时如何阻止 HTML 5 数据库被删除
Posted
技术标签:
【中文标题】使用 Phonegap 和 iOS 5.1 时如何阻止 HTML 5 数据库被删除【英文标题】:How to stop the HTML 5 database from being deleted, when using Phonegap and iOS 5.1 【发布时间】:2012-03-12 14:27:21 【问题描述】:我正在使用 phonegap 为 ios 创建一个测验风格的应用程序。该应用程序允许用户创建然后参加测验。
目前我正在使用一个 html 5 数据库,该数据库使用 phonegap API 来存储测试和结果数据。我担心当设备存储空间已满时,iOS 5.1 现在可以删除数据库。
是否有标记存储数据库的 webkit 缓存文件夹,使其永远不会被删除?如果这是不可能的,是否有任何建议以另一种方式来存储始终持久的数据。
【问题讨论】:
【参考方案1】:是的,可惜苹果在 iOS5.1 中这样做了
可以通过调用私有 API 来更改 WebKit 数据的位置。您应该能够将位置设置为像 Documents 这样的安全文件夹。我还没有测试这个解决方案,但是看看这个帖子:How do I enable Local Storage in my WebKit-based application?
Phonegap 团队也在解决这个问题:https://issues.apache.org/jira/browse/CB-330
另一种方法是使用带有 phonegap 插件的 SQLite(与 WebSQL 相同)。该插件将数据库保存在 Document 文件夹中,这意味着数据库没有被删除,而是由 iCloud 保存。
这里是原生 SQLite phonegap 插件:https://github.com/davibe/Phonegap-SQLitePlugin 关于这个插件,在某些情况下它比 WebSQL 慢一点,而且 WebSQL API 之间也有一些差异,但这里有一个适配器: https://gist.github.com/2009518
您还应该将旧的 WebSQL db 文件(存储在 Library/WebKit 或 Caches 目录中)迁移到 Document 文件夹。这是执行此操作的代码: https://gist.github.com/2009491
如果数据很重要,您应该将其保存到服务器。我写了一个小库来将 SQlite DB 同步到服务器: https://github.com/orbitaloop/WebSqlSync
【讨论】:
非常感谢您提供如此完整的答案!使用 Native SQLite 将解决我的问题,而无需对代码进行重大修改。 我现在开始实现这一点,但在使用适配器时遇到了一些问题。我有使用 HTML5 数据库的应用程序设置,您能否指出我需要进行的更改和/或如何使用适配器。 @nicktones:可以调用适配器中定义的函数,而不是调用 tx.executeSql。但我必须警告你,SQLite 插件有一些错误,而且它比 WebSQL 慢。 phonegap 团队已经找到了避免该问题的解决方案:issues.apache.org/jira/browse/CB-330【参考方案2】:Webkit 存储和 iOS 5.1 的两个问题都得到了修复
-
存储从 /Webkit 移动到 /Cache
在 iOS 5.1 下的应用更新(WebKit 错误)时,存储未调整为更新的文件夹结构
https://issues.apache.org/jira/browse/CB-330
这个解决方案似乎比仅仅更改调用私有 API 的 Webkit 数据的位置更安全。当应用程序运行时,将使用 Webkit 存储位置。在恢复或终止时,所有数据都会备份到文档文件夹中。时间戳确保 ab 旧备份不会覆盖较新的存储数据(如果应用崩溃...)。
最好的:使用旧版 iOS 版本的用户使用带有该修复程序的应用程序,不会因任何 iOS 更新而遭受损失。这就是为什么人们不应该等待......
【讨论】:
谢谢。已使用 PhoneGap 1.6 迁移到此解决方案 PhoneGap 1.6 是否内置了此修复程序?【参考方案3】:我不会使用 html5 数据库,而是通过 ajax(在远程服务器上,使用 php 和 mysql)发送/接收数据,最好是加密的(和 base64_encoded)。
【讨论】:
您好,谢谢,但我需要该应用程序能够完全离线运行。以上是关于使用 Phonegap 和 iOS 5.1 时如何阻止 HTML 5 数据库被删除的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 phonegap 制作适用于桌面窗口和 IOS 的应用程序?
如何从 Phonegap iOS 项目中删除未使用的框架和库?
PhoneGap/Cordova:如何使用 cookie (iOS)?