1

我正在使用 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 已被霸主弃用,但它仍然是我的工具,我现在想坚持使用它。

4

2 回答 2

1

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

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

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

于 2012-06-06T15:02:16.853 回答
1

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

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

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

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 变量存在时触发一次。

于 2012-07-03T08:39:45.937 回答