【问题标题】:Test if local database (websql) contains desired new fields, and add them if not测试本地数据库(websql)是否包含所需的新字段,如果没有则添加它们
【发布时间】:2012-06-10 13:08:43
【问题描述】:

我正在使用 PhoneGap 和 jQueryMobile 为 iOS 和 Android 构建一个跨平台的 HTML/Javascript 应用程序,并且我正在使用本地数据库 (localdatabase/websql) 的一个表中的一些新字段(其中包括)升级我的应用程序。

挑战 我想确保在使用新表字段、现有用户数据扩展数据库时,用户数据不会被删除或锁定在无法访问的旧版本数据库中。

背景: 我的应用程序有一个用户数据的本地数据库(收入和支出,加上一些设置)。这些数据需要持久化,当我开始时,要走的路是使用 HTML5 localDatabase 功能,因为它是持久的,并且可用于 iOS 和 Android 浏览器以及大多数桌面浏览器。

我正在使用一个名为 persistenceJS 的 Javascript 插件/库/thingy 来使处理 localdb 变得更容易一些。但我的问题并不是针对persistenceJS。

我正在开发一个新版本的应用程序,它使用了“设置”表中的一些新字段。所以当这些用户下载新应用并运行它时,它必须测试他们的设置表是否包含该字段,如果没有,则必须创建该字段。

如何进行此测试?我看到了两条思路:

  1. 使用在 openDatabase 函数中使用的数据库标签...。这似乎被一些开发人员用来存储版本号。 我对这个选项的问题是我只知道如何使用 openDatabase 打开一个数据库(如果不存在则创建一个新数据库),并在数据库尚不存在时专门运行回调。 因此,如果我在标签中指定诸如“v2”之类的内容时打开表,它会创建一个新表吗?如果是这样,它会将旧表的值复制到新表中吗?

  2. 检查表字段是否存在... 我可以使用 openDatabase 然后测试表字段的存在。如果他们没有,我可以添加它们。每次用户打开他们的应用时都会运行测试,这似乎有点原始。

顺便说一句: 我知道 webSQL/localDb 已经被霸主弃用了,但它仍然是我的工具,我现在想坚持下去。

【问题讨论】:

    标签: html persistence web-sql local-database opendatabase


    【解决方案1】:

    我在这里找到了答案:http://blog.maxaller.name/2010/03/html5-web-sql-database-intro-to-versioning-and-migrations/

    基本上,您只需使用新旧版本标签应用 changeVersion 方法。如果您没有标签,则旧标签是“”。在重新标记时,webSQL 会悄悄地将新模式应用于旧数据库。在我的情况下,这意味着添加新字段。

    我链接到的教程真的很棒(功能也是如此)。

    【讨论】:

      【解决方案2】:

      我正在添加另一个答案,因为我已经了解了有关 localDb opendatabase 和迁移它的更多信息。

      提醒一下,openDatabase 采用以下参数: name - (字符串)数据库的名称 版本标签 - (字符串)您要打开的版本 显示标签 - (字符串)一个相当无用的显示名称,似乎无处使用 最大尺寸 - (int) 最大安全尺寸为 5 * 1024 * 1024 如果 db 以前不存在,则新创建的 -= (function) 将被触发

      将 openDatabase 的输出分配给一个变量是最明智的。即

      myapp.db = openDatabase('mydb','','我的数据库',5*1024*1024,newlyCreatedCallback);

      首先,使用可用作 openDatabase 的第五个参数的“新创建的”回调似乎是明智的。仅当没有具有您指定参数的数据库时才会触发。为防止在您的数据库已经存在时触发此回调,请确保您将名称、显示标签和最大大小设置为与首次创建数据库时使用的值完全相同。

      这样做的原因是,如果数据库是第一次创建的,您肯定知道您不需要进行任何迁移。您可以直接进入添加表和字段的函数。我推荐使用persistenceJS,一个帮助你读取和操作本​​地数据库的工具。

      在调用 openDatabase 之前,明智的做法是使用 jQuery 创建一个自定义事件 'dbopen',其处理程序将执行迁移。这个处理程序可以由两个事件触发。第一个是我们刚刚讨论的“新创建的”回调。第二个是您在调用 openDatabase 后定义的 setInterval。间隔必须检查您将 openDatabase 输出分配给的 myapp.db 变量是否存在。

      创建 dbopen 自定义事件的原因是,如果您添加了一个“新创建的”回调,它会触发一大堆事件并在之后继续您的代码流,您将需要一个类似的过程来处理“非新创建的” ' 设想。执行此操作的 openDatabase 没有回调,因此您必须手动检测本地数据库的创建并在它存在时立即触发“dbopen”。

      我为此使用了 window.setInterval。确保使用 jquery 的 .one() 函数创建自定义的“dbopen”事件,该函数最多会触发一次。否则,如果数据库是新创建的,您将在“新创建”回调触发时触发一次 open 事件,并在 myapp.db 变量存在时触发一次。

      【讨论】:

      • 你能举一些这个回调的例子吗,我们也可以通过这个函数检查数据库的存在吗? @Wytze
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-07
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多