2012-06-06 20 views
1

我正在使用PhoneGap和jQueryMobile爲iOS和Android構建一個跨平臺的HTML/Javascript應用程序,並且我正在使用(除其他外)本地數據庫(localdatabase/websql)的一個表中的幾個新字段。測試本地數據庫(websql)是否包含所需的新字段,如果不是,則添加它們

我想確保當數據庫與新表中的字段,現有的用戶數據擴展,用戶數據不會被刪除或者被鎖定在inaccesible舊版本的數據庫的挑戰

背景: 我的應用程序有一個用戶數據(收入和支出,以及一些設置)的本地數據庫。這些數據需要堅持不懈,而且當我開始使用HTML5 localDatabase功能時,這種方法是持久的,並且可用於iOS和Android瀏覽器以及大多數桌面瀏覽器。

我正在使用一個名爲persistenceJS的Javascript插件/庫/ thingy來使處理localdb變得容易一些。但是我的問題並不是真正特定於persistenceJS。

我正在使用應用程序的新版本,該版本使用Settings表中的一些新字段。因此,當這些用戶下載新應用並運行它時,它必須測試他們的設置表是否包含此字段,如果不是,它必須創建該字段。

我該如何做這個測試?我看到兩條思路:

  1. 使用openDatabase函數中使用的數據庫標籤...。這似乎被某些開發人員用來存儲版本號。 這個選項我遇到的麻煩是我只知道如何使用openDatabase來打開數據庫(並創建一個新的數據庫,如果不存在的話),並且在數據庫尚不存在的情況下專門運行回調。 因此,如果我在標籤中指定類似「v2」的同時打開表格,它是否會創建一個新表格?如果是這樣,它會將舊錶格的值複製到新的值中嗎?

  2. 檢查是否存在表字段... 我可以使用openDatabase,然後測試表字段的存在性。如果他們不這樣做,我可以添加它們。每次用戶打開應用程序時都會運行測試,這似乎有點原始。

順便說一句: 我知道的WebSQL /的LocalDB已被統治者過時,但它仍然是我的工具,我想堅持到現在它。

回答

1

我添加了另一個答案,因爲我瞭解了更多關於localDb opendatabase並將其遷移的信息。

作爲提醒,的openDatabase採取這些參數: 名字 - 數據庫 版本標籤(字符串)的名稱 - (字符串)要打開 顯示標籤的版本 - (字符串)一個很沒用的顯示名稱,似乎將無處使用 最大尺寸 - (int)的最大安全尺寸爲5 * 1024 * 1024 新創建的 - =(功能),如果該數據庫沒有被解僱之前存在

這是最明智的分配的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'事件,該函數最多隻會觸發一次。否則,如果數據庫是新創建的,那麼當'新創建'回調觸發時以及一旦myapp.db變量出現時,您將觸發一次打開事件。

+0

你可以舉一些這個回調的例子,我們可以通過這個函數檢查數據庫的存在嗎? @Wytze – Learner

相關問題