【问题标题】:IndexedDB onupgradeneeded not firing on iOSIndexedDB onupgrade 不需要在 iOS 上触发
【发布时间】:2014-05-06 06:14:12
【问题描述】:

我已经阅读了several questions 关于此类问题的信息,因此我知道onupgradeneeded 的用途、何时应该调用它以及浏览器兼容性问题。

我正在开发一个应支持桌面版 Chrome 和 iOS 版 Safari 的网络应用程序。我在 Chrome 中使用 IndexedDB,但在使用移动 Safari 时使用 IndexedDBShim 实现以回退到 WebSQL。

系统在 Chrome 中一切正常。在移动 Safari 中,我第一次加载没有缓存数据的页面时,它将无法创建数据库,因为 onupgradeneeded 没有调用。但是:如果我重新加载页面,第二次加载onupgradeneeded 调用。从那里开始,垫片工作正常。

目前我的解决方法是显示一个警告,要求用户刷新页面 - 然后它就可以工作了。

我能做些什么更好?

【问题讨论】:

  • 代码?请注意,该事件被命名为upgradeneeded。回调被命名为onupgradeneeded
  • 谢谢。遇到这个问题后,我会保持简单并使用Mozilla Dev pages 中的代码。当我完成这项工作时,我会将其放入我的生产资料中。

标签: javascript html mobile-safari indexeddb shim


【解决方案1】:

我还注意到 indexedDBShim 的这个问题。如果您等待几毫秒,它会正常工作,所以也许您可以延迟您的代码?

我知道这不是一个完美的答案,但这是正在发生的错误:

"could not prepare statement (1 no such table: dbVersions)"

不知何故,这个错误被隐藏了(垫片中的一个错误),作为维护者之一,我可能会在有时间的时候研究它:)。

发生此错误是因为此代码被调用得有点快(大约在第 1570 行左右):

tx.executeSql("SELECT * FROM dbVersions where name = ?", [name], function(tx, data){ 

此表尚不存在,因为此代码尚未执行(大约第 1494 行):

tx.executeSql("CREATE TABLE IF NOT EXISTS dbVersions (name VARCHAR(255), version INT);", [], function(){

简而言之,您无能为力,因为它是 shim 中的一个错误,我认为延迟代码是解决问题的唯一方法。另一种可能性是修复垫片,但我认为这需要更多时间。

【讨论】:

  • 大眼睛!你也是 IDB 开发人员吗?我们很乐意邀请​​您加入 groups.google.com/forum/#!forum/indexeddb-users - 四位顶级 SO IDB 开发人员都在场。
  • 解决了,谢谢!当错误发生时,我尝试进行脚本刷新,但没有解决它,但是当用户执行刷新操作时,我应该意识到这是一种竞争条件。非常感谢!
猜你喜欢
  • 2012-11-17
  • 2017-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
  • 1970-01-01
  • 2016-09-09
相关资源
最近更新 更多